
var Prototype = {Version:"1.6.0.1", Browser:{IE:!!(window.attachEvent && !window.opera), Opera:!!window.opera, WebKit:navigator.userAgent.indexOf("AppleWebKit/") > -1, Gecko:navigator.userAgent.indexOf("Gecko") > -1 && navigator.userAgent.indexOf("KHTML") == -1, MobileSafari:!!navigator.userAgent.match(/Apple.*Mobile.*Safari/)}, BrowserFeatures:{XPath:!!document.evaluate, ElementExtensions:!!window.HTMLElement, SpecificElementExtensions:document.createElement("div").__proto__ && document.createElement("div").__proto__ !== document.createElement("form").__proto__}, ScriptFragment:"<script[^>]*>([\\S\\s]*?)</script>", JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/, emptyFunction:function () {
}, K:function (A) {
	return A;
}};
if (Prototype.Browser.MobileSafari) {
	Prototype.BrowserFeatures.SpecificElementExtensions = false;
}
var Class = {create:function () {
	var parent = null, properties = $A(arguments);
	if (Object.isFunction(properties[0])) {
		parent = properties.shift();
	}
	function klass() {
		this.initialize.apply(this, arguments);
	}
	Object.extend(klass, Class.Methods);
	klass.superclass = parent;
	klass.subclasses = [];
	if (parent) {
		var subclass = function () {
		};
		subclass.prototype = parent.prototype;
		klass.prototype = new subclass;
		parent.subclasses.push(klass);
	}
	for (var i = 0; i < properties.length; i++) {
		klass.addMethods(properties[i]);
	}
	if (!klass.prototype.initialize) {
		klass.prototype.initialize = Prototype.emptyFunction;
	}
	klass.prototype.constructor = klass;
	return klass;
}};
Class.Methods = {addMethods:function (source) {
	var ancestor = this.superclass && this.superclass.prototype;
	var properties = Object.keys(source);
	if (!Object.keys({toString:true}).length) {
		properties.push("toString", "valueOf");
	}
	for (var i = 0, length = properties.length; i < length; i++) {
		var property = properties[i], value = source[property];
		if (ancestor && Object.isFunction(value) && value.argumentNames().first() == "$super") {
			var method = value, value = Object.extend((function (m) {
				return function () {
					return ancestor[m].apply(this, arguments);
				};
			})(property).wrap(method), {valueOf:function () {
				return method;
			}, toString:function () {
				return method.toString();
			}});
		}
		this.prototype[property] = value;
	}
	return this;
}};
var Abstract = {};
Object.extend = function (destination, source) {
	for (var property in source) {
		destination[property] = source[property];
	}
	return destination;
};
Object.extend(Object, {inspect:function (object) {
	try {
		if (Object.isUndefined(object)) {
			return "undefined";
		}
		if (object === null) {
			return "null";
		}
		return object.inspect ? object.inspect() : object.toString();
	}
	catch (e) {
		if (e instanceof RangeError) {
			return "...";
		}
		throw e;
	}
}, toJSON:function (object) {
	var type = typeof object;
	switch (type) {
	  case "undefined":
	  case "function":
	  case "unknown":
		return;
	  case "boolean":
		return object.toString();
	}
	if (object === null) {
		return "null";
	}
	if (object.toJSON) {
		return object.toJSON();
	}
	if (Object.isElement(object)) {
		return;
	}
	var results = [];
	for (var property in object) {
		var value = Object.toJSON(object[property]);
		if (!Object.isUndefined(value)) {
			results.push(property.toJSON() + ": " + value);
		}
	}
	return "{" + results.join(", ") + "}";
}, toQueryString:function (object) {
	return $H(object).toQueryString();
}, toHTML:function (object) {
	return object && object.toHTML ? object.toHTML() : String.interpret(object);
}, keys:function (object) {
	var keys = [];
	for (var property in object) {
		keys.push(property);
	}
	return keys;
}, values:function (object) {
	var values = [];
	for (var property in object) {
		values.push(object[property]);
	}
	return values;
}, clone:function (object) {
	return Object.extend({}, object);
}, isElement:function (object) {
	return object && object.nodeType == 1;
}, isArray:function (object) {
	return object && object.constructor === Array;
}, isHash:function (object) {
	return object instanceof Hashtable;
}, isFunction:function (object) {
	return typeof object == "function";
}, isString:function (object) {
	return typeof object == "string";
}, isNumber:function (object) {
	return typeof object == "number";
}, isUndefined:function (object) {
	return typeof object == "undefined";
}});
Object.extend(Function.prototype, {argumentNames:function () {
	var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
	return names.length == 1 && !names[0] ? [] : names;
}, bind:function () {
	if (arguments.length < 2 && Object.isUndefined(arguments[0])) {
		return this;
	}
	var __method = this, args = $A(arguments), object = args.shift();
	return function () {
		return __method.apply(object, args.concat($A(arguments)));
	};
}, bindAsEventListener:function () {
	var __method = this, args = $A(arguments), object = args.shift();
	return function (event) {
		return __method.apply(object, [event || window.event].concat(args));
	};
}, curry:function () {
	if (!arguments.length) {
		return this;
	}
	var __method = this, args = $A(arguments);
	return function () {
		return __method.apply(this, args.concat($A(arguments)));
	};
}, delay:function () {
	var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
	return window.setTimeout(function () {
		return __method.apply(__method, args);
	}, timeout);
}, wrap:function (wrapper) {
	var __method = this;
	return function () {
		return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
	};
}, methodize:function () {
	if (this._methodized) {
		return this._methodized;
	}
	var __method = this;
	return this._methodized = function () {
		return __method.apply(null, [this].concat($A(arguments)));
	};
}});
Function.prototype.defer = Function.prototype.delay.curry(0.01);
Date.prototype.toJSON = function () {
	return "\"" + this.getUTCFullYear() + "-" + (this.getUTCMonth() + 1).toPaddedString(2) + "-" + this.getUTCDate().toPaddedString(2) + "T" + this.getUTCHours().toPaddedString(2) + ":" + this.getUTCMinutes().toPaddedString(2) + ":" + this.getUTCSeconds().toPaddedString(2) + "Z\"";
};
var Try = {these:function () {
	var returnValue;
	for (var i = 0, length = arguments.length; i < length; i++) {
		var lambda = arguments[i];
		try {
			returnValue = lambda();
			break;
		}
		catch (e) {
		}
	}
	return returnValue;
}};
RegExp.prototype.match = RegExp.prototype.test;
RegExp.escape = function (str) {
	return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
};
var PeriodicalExecuter = Class.create({initialize:function (callback, frequency) {
	this.callback = callback;
	this.frequency = frequency;
	this.currentlyExecuting = false;
	this.registerCallback();
}, registerCallback:function () {
	this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
}, execute:function () {
	this.callback(this);
}, stop:function () {
	if (!this.timer) {
		return;
	}
	clearInterval(this.timer);
	this.timer = null;
}, onTimerEvent:function () {
	if (!this.currentlyExecuting) {
		try {
			this.currentlyExecuting = true;
			this.execute();
		}
		finally {
			this.currentlyExecuting = false;
		}
	}
}});
Object.extend(String, {interpret:function (A) {
	return A == null ? "" : String(A);
}, specialChar:{"\b":"\\b", "\t":"\\t", "\n":"\\n", "\f":"\\f", "\r":"\\r", "\\":"\\\\"}});
Object.extend(String.prototype, {gsub:function (E, C) {
	var A = "", D = this, B;
	C = arguments.callee.prepareReplacement(C);
	while (D.length > 0) {
		if (B = D.match(E)) {
			A += D.slice(0, B.index);
			A += String.interpret(C(B));
			D = D.slice(B.index + B[0].length);
		} else {
			A += D, D = "";
		}
	}
	return A;
}, sub:function (C, A, B) {
	A = this.gsub.prepareReplacement(A);
	B = Object.isUndefined(B) ? 1 : B;
	return this.gsub(C, function (D) {
		if (--B < 0) {
			return D[0];
		}
		return A(D);
	});
}, scan:function (B, A) {
	this.gsub(B, A);
	return String(this);
}, truncate:function (B, A) {
	B = B || 30;
	A = Object.isUndefined(A) ? "..." : A;
	return this.length > B ? this.slice(0, B - A.length) + A : String(this);
}, strip:function () {
	return this.replace(/^\s+/, "").replace(/\s+$/, "");
}, stripTags:function () {
	return this.replace(/<\/?[^>]+>/gi, "");
}, stripScripts:function () {
	return this.replace(new RegExp(Prototype.ScriptFragment, "img"), "");
}, extractScripts:function () {
	var B = new RegExp(Prototype.ScriptFragment, "img");
	var A = new RegExp(Prototype.ScriptFragment, "im");
	return (this.match(B) || []).map(function (C) {
		return (C.match(A) || ["", ""])[1];
	});
}, evalScripts:function () {
	return this.extractScripts().map(function (script) {
		return eval(script);
	});
}, escapeHTML:function () {
	var A = arguments.callee;
	A.text.data = this;
	return A.div.innerHTML;
}, unescapeHTML:function () {
	var A = new Element("div");
	A.innerHTML = this.stripTags();
	return A.childNodes[0] ? (A.childNodes.length > 1 ? $A(A.childNodes).inject("", function (B, C) {
		return B + C.nodeValue;
	}) : A.childNodes[0].nodeValue) : "";
}, toQueryParams:function (B) {
	var A = this.strip().match(/([^?#]*)(#.*)?$/);
	if (!A) {
		return {};
	}
	return A[1].split(B || "&").inject({}, function (E, F) {
		if ((F = F.split("="))[0]) {
			var C = decodeURIComponent(F.shift());
			var D = F.length > 1 ? F.join("=") : F[0];
			if (D != undefined) {
				D = decodeURIComponent(D);
			}
			if (C in E) {
				if (!Object.isArray(E[C])) {
					E[C] = [E[C]];
				}
				E[C].push(D);
			} else {
				E[C] = D;
			}
		}
		return E;
	});
}, toArray:function () {
	return this.split("");
}, succ:function () {
	return this.slice(0, this.length - 1) + String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
}, times:function (A) {
	return A < 1 ? "" : new Array(A + 1).join(this);
}, camelize:function () {
	var D = this.split("-"), A = D.length;
	if (A == 1) {
		return D[0];
	}
	var C = this.charAt(0) == "-" ? D[0].charAt(0).toUpperCase() + D[0].substring(1) : D[0];
	for (var B = 1; B < A; B++) {
		C += D[B].charAt(0).toUpperCase() + D[B].substring(1);
	}
	return C;
}, capitalize:function () {
	return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
}, underscore:function () {
	return this.gsub(/::/, "/").gsub(/([A-Z]+)([A-Z][a-z])/, "#{1}_#{2}").gsub(/([a-z\d])([A-Z])/, "#{1}_#{2}").gsub(/-/, "_").toLowerCase();
}, dasherize:function () {
	return this.gsub(/_/, "-");
}, inspect:function (B) {
	var A = this.gsub(/[\x00-\x1f\\]/, function (C) {
		var D = String.specialChar[C[0]];
		return D ? D : "\\u00" + C[0].charCodeAt().toPaddedString(2, 16);
	});
	if (B) {
		return "\"" + A.replace(/"/g, "\\\"") + "\"";
	}
	return "'" + A.replace(/'/g, "\\'") + "'";
}, toJSON:function () {
	return this.inspect(true);
}, unfilterJSON:function (A) {
	return this.sub(A || Prototype.JSONFilter, "#{1}");
}, isJSON:function () {
	var A = this;
	if (A.blank()) {
		return false;
	}
	A = this.replace(/\\./g, "@").replace(/"[^"\\\n\r]*"/g, "");
	return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(A);
}, evalJSON:function (sanitize) {
	var json = this.unfilterJSON();
	try {
		if (!sanitize || json.isJSON()) {
			return eval("(" + json + ")");
		}
	}
	catch (e) {
	}
	throw new SyntaxError("Badly formed JSON string: " + this.inspect());
}, include:function (A) {
	return this.indexOf(A) > -1;
}, startsWith:function (A) {
	return this.indexOf(A) === 0;
}, endsWith:function (A) {
	var B = this.length - A.length;
	return B >= 0 && this.lastIndexOf(A) === B;
}, empty:function () {
	return this == "";
}, blank:function () {
	return /^\s*$/.test(this);
}, interpolate:function (A, B) {
	return new Template(this, B).evaluate(A);
}});
if (Prototype.Browser.WebKit || Prototype.Browser.IE) {
	Object.extend(String.prototype, {escapeHTML:function () {
		return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
	}, unescapeHTML:function () {
		return this.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">");
	}});
}
String.prototype.gsub.prepareReplacement = function (B) {
	if (Object.isFunction(B)) {
		return B;
	}
	var A = new Template(B);
	return function (C) {
		return A.evaluate(C);
	};
};
String.prototype.parseQuery = String.prototype.toQueryParams;
Object.extend(String.prototype.escapeHTML, {div:document.createElement("div"), text:document.createTextNode("")});
with (String.prototype.escapeHTML) {
	div.appendChild(text);
}
var Template = Class.create({initialize:function (A, B) {
	this.template = A.toString();
	this.pattern = B || Template.Pattern;
}, evaluate:function (A) {
	if (Object.isFunction(A.toTemplateReplacements)) {
		A = A.toTemplateReplacements();
	}
	return this.template.gsub(this.pattern, function (D) {
		if (A == null) {
			return "";
		}
		var F = D[1] || "";
		if (F == "\\") {
			return D[2];
		}
		var B = A, G = D[3];
		var E = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
		D = E.exec(G);
		if (D == null) {
			return F;
		}
		while (D != null) {
			var C = D[1].startsWith("[") ? D[2].gsub("\\\\]", "]") : D[1];
			B = B[C];
			if (null == B || "" == D[3]) {
				break;
			}
			G = G.substring("[" == D[3] ? D[1].length : D[0].length);
			D = E.exec(G);
		}
		return F + String.interpret(B);
	}.bind(this));
}});
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
var $break = {};
var Enumerable = {each:function (C, B) {
	var A = 0;
	C = C.bind(B);
	try {
		this._each(function (E) {
			C(E, A++);
		});
	}
	catch (D) {
		if (D != $break) {
			throw D;
		}
	}
	return this;
}, eachSlice:function (D, C, B) {
	C = C ? C.bind(B) : Prototype.K;
	var A = -D, E = [], F = this.toArray();
	while ((A += D) < F.length) {
		E.push(F.slice(A, A + D));
	}
	return E.collect(C, B);
}, all:function (C, B) {
	C = C ? C.bind(B) : Prototype.K;
	var A = true;
	this.each(function (E, D) {
		A = A && !!C(E, D);
		if (!A) {
			throw $break;
		}
	});
	return A;
}, any:function (C, B) {
	C = C ? C.bind(B) : Prototype.K;
	var A = false;
	this.each(function (E, D) {
		if (A = !!C(E, D)) {
			throw $break;
		}
	});
	return A;
}, collect:function (C, B) {
	C = C ? C.bind(B) : Prototype.K;
	var A = [];
	this.each(function (E, D) {
		A.push(C(E, D));
	});
	return A;
}, detect:function (C, B) {
	C = C.bind(B);
	var A;
	this.each(function (E, D) {
		if (C(E, D)) {
			A = E;
			throw $break;
		}
	});
	return A;
}, findAll:function (C, B) {
	C = C.bind(B);
	var A = [];
	this.each(function (E, D) {
		if (C(E, D)) {
			A.push(E);
		}
	});
	return A;
}, grep:function (D, C, B) {
	C = C ? C.bind(B) : Prototype.K;
	var A = [];
	if (Object.isString(D)) {
		D = new RegExp(D);
	}
	this.each(function (F, E) {
		if (D.match(F)) {
			A.push(C(F, E));
		}
	});
	return A;
}, include:function (A) {
	if (Object.isFunction(this.indexOf)) {
		if (this.indexOf(A) != -1) {
			return true;
		}
	}
	var B = false;
	this.each(function (C) {
		if (C == A) {
			B = true;
			throw $break;
		}
	});
	return B;
}, inGroupsOf:function (B, A) {
	A = Object.isUndefined(A) ? null : A;
	return this.eachSlice(B, function (C) {
		while (C.length < B) {
			C.push(A);
		}
		return C;
	});
}, inject:function (A, C, B) {
	C = C.bind(B);
	this.each(function (E, D) {
		A = C(A, E, D);
	});
	return A;
}, invoke:function (B) {
	var A = $A(arguments).slice(1);
	return this.map(function (C) {
		return C[B].apply(C, A);
	});
}, max:function (C, B) {
	C = C ? C.bind(B) : Prototype.K;
	var A;
	this.each(function (E, D) {
		E = C(E, D);
		if (A == null || E >= A) {
			A = E;
		}
	});
	return A;
}, min:function (C, B) {
	C = C ? C.bind(B) : Prototype.K;
	var A;
	this.each(function (E, D) {
		E = C(E, D);
		if (A == null || E < A) {
			A = E;
		}
	});
	return A;
}, partition:function (D, B) {
	D = D ? D.bind(B) : Prototype.K;
	var C = [], A = [];
	this.each(function (F, E) {
		(D(F, E) ? C : A).push(F);
	});
	return [C, A];
}, pluck:function (B) {
	var A = [];
	this.each(function (C) {
		A.push(C[B]);
	});
	return A;
}, reject:function (C, B) {
	C = C.bind(B);
	var A = [];
	this.each(function (E, D) {
		if (!C(E, D)) {
			A.push(E);
		}
	});
	return A;
}, sortBy:function (B, A) {
	B = B.bind(A);
	return this.map(function (D, C) {
		return {value:D, criteria:B(D, C)};
	}).sort(function (F, E) {
		var D = F.criteria, C = E.criteria;
		return D < C ? -1 : D > C ? 1 : 0;
	}).pluck("value");
}, toArray:function () {
	return this.map();
}, zip:function () {
	var B = Prototype.K, A = $A(arguments);
	if (Object.isFunction(A.last())) {
		B = A.pop();
	}
	var C = [this].concat(A).map($A);
	return this.map(function (E, D) {
		return B(C.pluck(D));
	});
}, size:function () {
	return this.toArray().length;
}, inspect:function () {
	return "#<Enumerable:" + this.toArray().inspect() + ">";
}};
Object.extend(Enumerable, {map:Enumerable.collect, find:Enumerable.detect, select:Enumerable.findAll, filter:Enumerable.findAll, member:Enumerable.include, entries:Enumerable.toArray, every:Enumerable.all, some:Enumerable.any});
function $A(C) {
	if (!C) {
		return [];
	}
	if (C.toArray) {
		return C.toArray();
	}
	var B = C.length, A = new Array(B);
	while (B--) {
		A[B] = C[B];
	}
	return A;
}
if (Prototype.Browser.WebKit) {
	function $A(C) {
		if (!C) {
			return [];
		}
		if (!(Object.isFunction(C) && C == "[object NodeList]") && C.toArray) {
			return C.toArray();
		}
		var B = C.length, A = new Array(B);
		while (B--) {
			A[B] = C[B];
		}
		return A;
	}
}
Array.from = $A;
Object.extend(Array.prototype, Enumerable);
if (!Array.prototype._reverse) {
	Array.prototype._reverse = Array.prototype.reverse;
}
Object.extend(Array.prototype, {_each:function (B) {
	for (var A = 0, C = this.length; A < C; A++) {
		B(this[A]);
	}
}, clear:function () {
	this.length = 0;
	return this;
}, first:function () {
	return this[0];
}, last:function () {
	return this[this.length - 1];
}, compact:function () {
	return this.select(function (A) {
		return A != null;
	});
}, flatten:function () {
	return this.inject([], function (B, A) {
		return B.concat(Object.isArray(A) ? A.flatten() : [A]);
	});
}, without:function () {
	var A = $A(arguments);
	return this.select(function (B) {
		return !A.include(B);
	});
}, reverse:function (A) {
	return (A !== false ? this : this.toArray())._reverse();
}, reduce:function () {
	return this.length > 1 ? this : this[0];
}, uniq:function (A) {
	return this.inject([], function (D, C, B) {
		if (0 == B || (A ? D.last() != C : !D.include(C))) {
			D.push(C);
		}
		return D;
	});
}, intersect:function (A) {
	return this.uniq().findAll(function (B) {
		return A.detect(function (C) {
			return B === C;
		});
	});
}, clone:function () {
	return [].concat(this);
}, size:function () {
	return this.length;
}, inspect:function () {
	return "[" + this.map(Object.inspect).join(", ") + "]";
}, toJSON:function () {
	var A = [];
	this.each(function (B) {
		var C = Object.toJSON(B);
		if (!Object.isUndefined(C)) {
			A.push(C);
		}
	});
	return "[" + A.join(", ") + "]";
}});
if (Object.isFunction(Array.prototype.forEach)) {
	Array.prototype._each = Array.prototype.forEach;
}
if (!Array.prototype.indexOf) {
	Array.prototype.indexOf = function (C, A) {
		A || (A = 0);
		var B = this.length;
		if (A < 0) {
			A = B + A;
		}
		for (; A < B; A++) {
			if (this[A] === C) {
				return A;
			}
		}
		return -1;
	};
}
if (!Array.prototype.lastIndexOf) {
	Array.prototype.lastIndexOf = function (B, A) {
		A = isNaN(A) ? this.length : (A < 0 ? this.length + A : A) + 1;
		var C = this.slice(0, A).reverse().indexOf(B);
		return (C < 0) ? C : A - C - 1;
	};
}
Array.prototype.toArray = Array.prototype.clone;
function $w(A) {
	if (!Object.isString(A)) {
		return [];
	}
	A = A.strip();
	return A ? A.split(/\s+/) : [];
}
if (Prototype.Browser.Opera) {
	Array.prototype.concat = function () {
		var E = [];
		for (var B = 0, C = this.length; B < C; B++) {
			E.push(this[B]);
		}
		for (var B = 0, C = arguments.length; B < C; B++) {
			if (Object.isArray(arguments[B])) {
				for (var A = 0, D = arguments[B].length; A < D; A++) {
					E.push(arguments[B][A]);
				}
			} else {
				E.push(arguments[B]);
			}
		}
		return E;
	};
}
Object.extend(Number.prototype, {toColorPart:function () {
	return this.toPaddedString(2, 16);
}, succ:function () {
	return this + 1;
}, times:function (A) {
	$R(0, this, true).each(A);
	return this;
}, toPaddedString:function (C, B) {
	var A = this.toString(B || 10);
	return "0".times(C - A.length) + A;
}, toJSON:function () {
	return isFinite(this) ? this.toString() : "null";
}});
$w("abs round ceil floor").each(function (A) {
	Number.prototype[A] = Math[A].methodize();
});
function $H(A) {
	return new Hashtable(A);
}
var Hashtable = Class.create(Enumerable, (function () {
	function A(B, C) {
		if (Object.isUndefined(C)) {
			return B;
		}
		return B + "=" + encodeURIComponent(String.interpret(C));
	}
	return {initialize:function (B) {
		this._object = Object.isHash(B) ? B.toObject() : Object.clone(B);
	}, _each:function (C) {
		for (var B in this._object) {
			var D = this._object[B], E = [B, D];
			E.key = B;
			E.value = D;
			C(E);
		}
	}, set:function (B, C) {
		return this._object[B] = C;
	}, get:function (B) {
		return this._object[B];
	}, unset:function (B) {
		var C = this._object[B];
		delete this._object[B];
		return C;
	}, toObject:function () {
		return Object.clone(this._object);
	}, keys:function () {
		return this.pluck("key");
	}, values:function () {
		return this.pluck("value");
	}, index:function (C) {
		var B = this.detect(function (D) {
			return D.value === C;
		});
		return B && B.key;
	}, merge:function (B) {
		return this.clone().update(B);
	}, update:function (B) {
		return new Hashtable(B).inject(this, function (C, D) {
			C.set(D.key, D.value);
			return C;
		});
	}, toQueryString:function () {
		return this.map(function (D) {
			var C = encodeURIComponent(D.key), B = D.value;
			if (B && typeof B == "object") {
				if (Object.isArray(B)) {
					return B.map(A.curry(C)).join("&");
				}
			}
			return A(C, B);
		}).join("&");
	}, inspect:function () {
		return "#<Hash:{" + this.map(function (B) {
			return B.map(Object.inspect).join(": ");
		}).join(", ") + "}>";
	}, toJSON:function () {
		return Object.toJSON(this.toObject());
	}, clone:function () {
		return new Hashtable(this);
	}};
})());
Hashtable.prototype.toTemplateReplacements = Hashtable.prototype.toObject;
Hashtable.from = $H;
var ObjectRange = Class.create(Enumerable, {initialize:function (C, A, B) {
	this.start = C;
	this.end = A;
	this.exclusive = B;
}, _each:function (A) {
	var B = this.start;
	while (this.include(B)) {
		A(B);
		B = B.succ();
	}
}, include:function (A) {
	if (A < this.start) {
		return false;
	}
	if (this.exclusive) {
		return A < this.end;
	}
	return A <= this.end;
}});
var $R = function (C, A, B) {
	return new ObjectRange(C, A, B);
};
var Ice = new Object;
Object.methods = function (A) {
	for (property in A) {
		this.prototype[property] = A[property];
	}
};
Object.subclass = function (A) {
	var B = function () {
		this.initialize.apply(this, arguments);
	};
	B.methods = this.methods;
	B.subclass = this.subclass;
	B.prototype.initialize = Function.NOOP;
	B.methods(this.prototype);
	B.prototype.initializeSuperclass = this.prototype.initialize ? this.prototype.initialize : Function.NOOP;
	B.methods(A || {});
	return B;
};
Boolean.prototype.ifTrue = function (A) {
	if (this == true) {
		A();
	}
	return this;
};
Boolean.prototype.ifFalse = function (A) {
	if (this == false) {
		A();
	}
	return this;
};
Number.prototype.asZeroPrefixedString = function () {
	return this < 9 ? ("0" + this) : this.toString();
};
Date.prototype.toTimestamp = function () {
	return this.toLocaleTimeString().substr(0, 8);
};
Object.extend(String.prototype, {asBoolean:function () {
	return "true" == this || "yes" == this;
}, asNumber:function () {
	return this * 1;
}, asElement:function () {
	return document.getElementById(this);
}, asExtendedElement:function () {
	var A = this.asElement();
	if (!A) {
		throw "cannot find element with id: '" + this + "'";
	}
	return Ice.ElementModel.Element.adaptToElement(A);
}, asRegexp:function () {
	return new RegExp(this);
}, contains:function (A) {
	return this.indexOf(A) >= 0;
}, containsWords:function () {
	return /(\w+)/.test(this);
}});
Object.extend(Array.prototype, {eachWithGuard:function (A) {
	this.each(function (B) {
		try {
			A(B);
		}
		catch (C) {
		}
	});
}, intersect:function (A) {
	return this.select(function (B) {
		return A.include(B);
	});
}, complement:function (A) {
	return this.reject(function (B) {
		return A.include(B);
	});
}, isEmpty:function () {
	return this.length == 0;
}, isNotEmpty:function () {
	return this.length > 0;
}, as:function (A) {
	A.apply(A, this);
}, copy:function () {
	return this.collect(function (A) {
		return A;
	});
}, copyFrom:function (E, C) {
	var D = [];
	var A = E + C;
	for (var B = E; B < A; B++) {
		D.push(this[B]);
	}
	return D;
}, broadcast:function (A) {
	this.each(function (B) {
		B(A);
	});
}, broadcaster:function () {
	return function (A) {
		this.broadcast(A);
	}.bind(this);
}, asSet:function () {
	var A = [];
	this.each(function (B) {
		if (!A.include(B)) {
			A.push(B);
		}
	});
	return A;
}});
Function.prototype.delayFor = function (A) {
	var B = this;
	return function () {
		var D = this;
		var E = arguments;
		var C = function () {
			try {
				B.apply(D, E);
			}
			finally {
				clearInterval(E.id);
				E.id = null;
			}
		};
		var F = E.id = setInterval(C, A);
		arguments.callee.cancel = function () {
			clearInterval(F);
			E.id = null;
		};
	};
};
Function.prototype.delayExecutionFor = function (A) {
	var B = this.delayFor(A);
	B.apply();
	return B;
};
Function.prototype.repeatEvery = function (A) {
	var B = this;
	return function () {
		var D = this;
		var E = arguments;
		var C = function () {
			B.apply(D, E);
		};
		var F = setInterval(C, A);
		arguments.callee.cancel = function () {
			clearInterval(F);
		};
	};
};
Function.prototype.repeatExecutionEvery = function (A) {
	var B = this.repeatEvery(A);
	B.apply(this);
	return B;
};
Function.NOOP = function () {
};
window.width = function () {
	return window.innerWidth ? window.innerWidth : (document.documentElement && document.documentElement.clientWidth) ? document.documentElement.clientWidth : document.body.clientWidth;
};
window.height = function () {
	return window.innerHeight ? window.innerHeight : (document.documentElement && document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.body.clientHeight;
};
["onLoad", "onUnload", "onBeforeUnload", "onResize", "onScroll"].each(function (A) {
	if (!window[A]) {
		window[A] = function (D) {
			var B = A.toLowerCase();
			var E = window[B];
			var C = E ? [E, D] : [D];
			window[B] = C.broadcaster();
			window[A] = function (F) {
				if (!C.detect(function (G) {
					return G.toString() == F.toString();
				})) {
					C.push(F);
				}
			};
		};
	}
});
if (typeof OpenAjax != "undefined") {
	if (typeof OpenAjax.addOnLoad != "undefined") {
		var current = window.onLoad;
		window.onLoad = OpenAjax.addOnLoad;
		OpenAjax.addOnLoad(current);
	}
	if (typeof OpenAjax.addOnUnLoad != "undefined") {
		var current = window.onUnload;
		window.onUnload = OpenAjax.addOnUnLoad;
		OpenAjax.addOnLoad(current);
	}
}
window.onKeyPress = function (A) {
	var B = document.onkeypress;
	document.onkeypress = B ? function (C) {
		A(Ice.EventModel.Event.adaptToEvent(C));
		B(C);
	} : function (C) {
		A(Ice.EventModel.Event.adaptToKeyEvent(C));
	};
};
window.onKeyUp = function (A) {
	var B = document.onkeyup;
	document.onkeyup = B ? function (C) {
		A(Ice.EventModel.Event.adaptToEvent(C));
		B(C);
	} : function (C) {
		A(Ice.EventModel.Event.adaptToKeyEvent(C));
	};
};
[Ice].as(function (A) {
	A.Enumerator = Object.subclass({initialize:function (B) {
		this.indexedObject = B;
	}, _each:function (C) {
		var D = this.indexedObject.length;
		for (var B = 0; B < D; B++) {
			C(this.indexedObject[B], B);
		}
	}, reverse:function () {
		return new A.ReverseEnumerator(this.indexedObject);
	}});
	A.Enumerator.methods(Enumerable);
	A.ReverseEnumerator = A.Enumerator.subclass({_each:function (C) {
		var D = this.indexedObject.length - 1;
		for (var B = D; B >= 0; B--) {
			C(this.indexedObject[B], B);
		}
	}, reverse:function () {
		return new A.Enumerator(this.indexedObject);
	}});
	window.$enumerate = function (B) {
		return new A.Enumerator(B);
	};
});
[Ice.Log = new Object].as(function (A) {
	A.Priority = Object.subclass({debug:function (C, E, D, B) {
		C.debug(E, D, B);
	}, info:function (C, E, D, B) {
		C.info(E, D, B);
	}, warn:function (C, E, D, B) {
		C.warn(E, D, B);
	}, error:function (C, E, D, B) {
		C.error(E, D, B);
	}});
	A.Debug = A.Priority.subclass({asString:function () {
		return "Debug";
	}});
	A.Info = A.Debug.subclass({debug:Function.NOOP, asString:function () {
		return "Info";
	}});
	A.Warn = A.Info.subclass({info:Function.NOOP, asString:function () {
		return "Warn";
	}});
	A.Error = A.Warn.subclass({warn:Function.NOOP, asString:function () {
		return "Error";
	}});
	A.Priority.DEBUG = new A.Debug;
	A.Priority.INFO = new A.Info;
	A.Priority.WARN = new A.Warn;
	A.Priority.ERROR = new A.Error;
	A.Priority.Levels = [A.Priority.DEBUG, A.Priority.INFO, A.Priority.WARN, A.Priority.ERROR];
	A.Logger = Object.subclass({initialize:function (D, C, B) {
		this.handler = C || {debug:Function.NOOP, info:Function.NOOP, warn:Function.NOOP, error:Function.NOOP};
		this.category = D;
		this.children = [];
		this.priority = B || A.Priority.ERROR;
	}, debug:function (C, B) {
		this.priority.debug(this.handler, this.category, C, B);
	}, info:function (C, B) {
		this.priority.info(this.handler, this.category, C, B);
	}, warn:function (C, B) {
		this.priority.warn(this.handler, this.category, C, B);
	}, error:function (C, B) {
		this.priority.error(this.handler, this.category, C, B);
	}, child:function (C) {
		var B = this.category.copy();
		B.push(C);
		var D = new A.Logger(B, this.handler, this.priority);
		this.children.push(D);
		return D;
	}, threshold:function (B) {
		this.priority = B;
		this.children.each(function (C) {
			C.threshold(B);
		});
	}, handleWith:function (B) {
		this.handler = B;
	}});
	A.WindowLogHandler = Object.subclass({initialize:function (D, E, B, C) {
		this.lineOptions = [25, 50, 100, 200, 400];
		this.logger = D;
		this.logger.handleWith(this);
		this.parentWindow = E;
		this.lines = B || this.lineOptions[3];
		this.thresholdPriority = C || A.Priority.DEBUG;
		this.categoryMatcher = /.*/;
		this.closeOnExit = true;
		this.toggle();
		this.parentWindow.onKeyUp(function (G) {
			var F = G.keyCode();
			if ((F == 20 || F == 84) && (G.isCtrlPressed() || G.isAltPressed()) && G.isShiftPressed()) {
				this.enable();
			}
		}.bind(this));
		this.parentWindow.onUnload(function () {
			window.logger.info("page unloaded!");
			this.disable();
		}.bind(this));
	}, enable:function () {
		try {
			this.window = this.parentWindow.open("", "log" + window.identifier, "scrollbars=1,width=800,height=680");
			var D = this.window.document;
			this.log = this.window.document.getElementById("log-window");
			this.toggle();
			if (this.log) {
				return;
			}
			D.body.appendChild(D.createTextNode(" Close on exit "));
			var I = D.createElement("input");
			I.style.margin = "2px";
			I.setAttribute("type", "checkbox");
			I.defaultChecked = true;
			I.checked = true;
			I.onclick = function () {
				this.closeOnExit = I.checked;
			}.bind(this);
			D.body.appendChild(I);
			D.body.appendChild(D.createTextNode(" Lines "));
			var C = D.createElement("select");
			C.style.margin = "2px";
			this.lineOptions.each(function (L, J) {
				var K = C.appendChild(D.createElement("option"));
				if (this.lines == L) {
					C.selectedIndex = J;
				}
				K.appendChild(D.createTextNode(L.toString()));
			}.bind(this));
			C.onchange = function (J) {
				this.lines = this.lineOptions[C.selectedIndex];
				this.clearPreviousEvents();
			}.bind(this);
			D.body.appendChild(C);
			D.body.appendChild(D.createTextNode(" Category "));
			var H = D.createElement("input");
			H.style.margin = "2px";
			H.setAttribute("type", "text");
			H.setAttribute("value", this.categoryMatcher.source);
			H.onchange = function () {
				this.categoryMatcher = H.value.asRegexp();
			}.bind(this);
			D.body.appendChild(H);
			D.body.appendChild(D.createTextNode(" Level "));
			var B = D.createElement("select");
			B.style.margin = "2px";
			A.Priority.Levels.each(function (K, J) {
				var L = B.appendChild(D.createElement("option"));
				if (this.thresholdPriority == K) {
					B.selectedIndex = J;
				}
				L.appendChild(D.createTextNode(K.asString()));
			}.bind(this));
			this.logger.threshold(this.thresholdPriority);
			B.onchange = function (J) {
				this.thresholdPriority = A.Priority.Levels[B.selectedIndex];
				this.logger.threshold(this.thresholdPriority);
			}.bind(this);
			D.body.appendChild(B);
			var F = D.createElement("input");
			F.style.margin = "2px";
			F.setAttribute("type", "button");
			F.setAttribute("value", "Stop");
			F.onclick = function () {
				F.setAttribute("value", this.toggle() ? "Stop" : "Start");
			}.bind(this);
			D.body.appendChild(F);
			var G = D.createElement("input");
			G.style.margin = "2px";
			G.setAttribute("type", "button");
			G.setAttribute("value", "Clear");
			G.onclick = function () {
				this.clearAllEvents();
			}.bind(this);
			D.body.appendChild(G);
			this.log = D.body.appendChild(D.createElement("pre"));
			this.log.id = "log-window";
			this.log.style.width = "100%";
			this.log.style.minHeight = "0";
			this.log.style.maxHeight = "550px";
			this.log.style.borderWidth = "1px";
			this.log.style.borderStyle = "solid";
			this.log.style.borderColor = "#999";
			this.log.style.backgroundColor = "#ddd";
			this.log.style.overflow = "scroll";
			this.window.onunload = function () {
				this.disable();
			}.bind(this);
		}
		catch (E) {
			this.disable();
		}
	}, disable:function () {
		this.logger.threshold(A.Priority.ERROR);
		this.handle = Function.NOOP;
		if (this.closeOnExit && this.window) {
			this.window.close();
		}
	}, toggle:function () {
		if (this.handle == Function.NOOP) {
			delete this.handle;
			return true;
		} else {
			this.handle = Function.NOOP;
			return false;
		}
	}, debug:function (D, C, B) {
		this.handle("#333", "debug", D, C, B);
	}, info:function (D, C, B) {
		this.handle("green", "info", D, C, B);
	}, warn:function (D, C, B) {
		this.handle("orange", "warn", D, C, B);
	}, error:function (D, C, B) {
		this.handle("red", "error", D, C, B);
	}, handle:function (I, E, B, J, C) {
		try {
			if (this.categoryMatcher.test(B.join("."))) {
				var F = this.log.ownerDocument;
				var H = (new Date()).toTimestamp();
				var D = B.join(".");
				("[" + D + "] : " + J + (C ? ("\n" + C) : "")).split("\n").each(function (K) {
					if (K.containsWords()) {
						var L = F.createElement("div");
						L.style.padding = "3px";
						L.style.color = I;
						L.setAttribute("title", H + " | " + E);
						this.log.appendChild(L).appendChild(F.createTextNode(K));
					}
				}.bind(this));
				this.log.scrollTop = this.log.scrollHeight;
			}
			this.clearPreviousEvents();
		}
		catch (G) {
			this.disable();
		}
	}, clearPreviousEvents:function () {
		var B = $A(this.log.childNodes);
		B.copyFrom(0, B.length - this.lines).each(function (C) {
			this.log.removeChild(C);
		}.bind(this));
	}, clearAllEvents:function () {
		$A(this.log.childNodes).each(function (B) {
			this.log.removeChild(B);
		}.bind(this));
	}});
	A.NOOPConsole = {debug:Function.NOOP, info:Function.NOOP, warn:Function.NOOP, error:Function.NOOP};
	A.FirebugLogHandler = Object.subclass({initialize:function (B) {
		B.handleWith(this);
		this.logger = B;
		this.console = A.NOOPConsole;
		this.enable();
	}, enable:function () {
		this.console = window.console;
		this.logger.threshold(A.Priority.DEBUG);
		this.logger.warn("Firebug (version < 1.2) logging can cause increased memory consumption when running for a long period of time!");
	}, disable:function () {
		this.console = A.NOOPConsole;
		this.logger.threshold(A.Priority.ERROR);
	}, toggle:Function.NOOP, debug:function (D, C, B) {
		B ? this.console.debug(this.format(D, C), B) : this.console.debug(this.format(D, C));
	}, info:function (D, C, B) {
		B ? this.console.info(this.format(D, C), B) : this.console.info(this.format(D, C));
	}, warn:function (D, C, B) {
		B ? this.console.warn(this.format(D, C), B) : this.console.warn(this.format(D, C));
	}, error:function (D, C, B) {
		B ? this.console.error(this.format(D, C), B) : this.console.error(this.format(D, C));
	}, format:function (C, B) {
		return "[" + C.join(".") + "] " + B;
	}});
});
[Ice.Ajax = new Object].as(function (A) {
	A.Client = Object.subclass({initialize:function (B) {
		this.logger = B;
		this.cookies = new Object;
		document.cookie.split("; ").each(function (E) {
			var D = E.split("=");
			this.cookies[D.first()] = D.last();
		}.bind(this));
		try {
			if (window.createRequest) {
				this.createRequest = function () {
					var D = new A.RequestProxy(window.createRequest(), this.logger);
					D.post = function (E, H, F, G) {
						this.get(E, H, F, G);
					};
					return D;
				}.bind(this);
			} else {
				if (window.XMLHttpRequest) {
					this.createRequest = function () {
						return new A.RequestProxy(new XMLHttpRequest(), this.logger);
					}.bind(this);
				} else {
					if (window.ActiveXObject) {
						this.createRequest = function () {
							return new A.RequestProxy(new ActiveXObject("Microsoft.XMLHTTP"), this.logger);
						}.bind(this);
					}
				}
			}
		}
		catch (C) {
			this.logger.error("failed to create factory request", C);
		}
	}, getAsynchronously:function (D, B, C) {
		return this.createRequest().getAsynchronously(D, B, C);
	}, getSynchronously:function (D, B, C) {
		return this.createRequest().getSynchronously(D, B, C);
	}, postAsynchronously:function (D, B, C) {
		return this.createRequest().postAsynchronously(D, B, C);
	}, postSynchronously:function (D, B, C) {
		return this.createRequest().postSynchronously(D, B, C);
	}});
	A.RequestProxy = Object.subclass({initialize:function (D, C) {
		this.identifier = +Math.random().toString().substr(2, 7);
		this.request = D;
		this.logger = C;
		this.callbacks = [];
		var B = this;
		this.responseCallback = function () {
			if (D.readyState == 4) {
				B.logger.debug("[" + B.identifier + "] : receive [" + B.statusCode() + "] " + B.statusText());
				var F = B.callbacks.length;
				for (var E = 0; E < F; E++) {
					try {
						B.callbacks[E](B);
					}
					catch (G) {
						C.warn("connection closed prematurely", G);
						B.close();
					}
				}
			}
		};
	}, statusCode:function () {
		try {
			return this.request.status;
		}
		catch (B) {
			return 0;
		}
	}, statusText:function () {
		try {
			return this.request.statusText;
		}
		catch (B) {
			return "";
		}
	}, on:function (C, B) {
		this.callbacks.push(function (D) {
			if (C(D)) {
				B(D);
			}
		});
	}, isServerError:function () {
		try {
			return this.request.status == 500;
		}
		catch (B) {
			return false;
		}
	}, isEmpty:function () {
		try {
			return this.request.responseText == "";
		}
		catch (B) {
			return true;
		}
	}, getAsynchronously:function (D, B, C) {
		this.request.open("GET", D + "?" + B + "&rand=" + Math.random(), true);
		if (C) {
			C(this);
		}
		this.request.onreadystatechange = this.responseCallback;
		this.logger.debug("[" + this.identifier + "] : send asynchronous GET");
		this.request.send("");
		return this;
	}, postAsynchronously:function (D, B, C) {
		this.request.open("POST", D, true);
		if (C) {
			C(this);
		}
		this.request.onreadystatechange = this.responseCallback;
		this.logger.debug("[" + this.identifier + "] : send asynchronous POST");
		this.request.send(B + "&rand=" + Math.random() + "\n\n");
		return this;
	}, getSynchronously:function (D, B, C) {
		this.request.open("GET", D + "?" + B + "&rand=" + Math.random(), false);
		if (C) {
			C(this);
		}
		this.logger.debug("[" + this.identifier + "] : send synchronous GET");
		this.request.send("");
		this.responseCallback();
		return this;
	}, postSynchronously:function (D, B, C) {
		this.request.open("POST", D, false);
		if (C) {
			C(this);
		}
		this.logger.debug("[" + this.identifier + "] : send synchronous POST");
		this.request.send(B + "&rand=" + Math.random() + "\n\n");
		this.responseCallback();
		return this;
	}, setRequestHeader:function (B, C) {
		this.request.setRequestHeader(B, C);
	}, getResponseHeader:function (B) {
		try {
			return this.request.getResponseHeader(B);
		}
		catch (C) {
			return null;
		}
	}, containsResponseHeader:function (B) {
		try {
			var D = this.request.getResponseHeader(B);
			return D && D != "";
		}
		catch (C) {
			return false;
		}
	}, content:function () {
		try {
			return this.request.responseText;
		}
		catch (B) {
			return "";
		}
	}, contentAsDOM:function () {
		return this.request.responseXML;
	}, abort:function () {
		if (this.request) {
			try {
				this.request.onreadystatechange = Function.NOOP;
				this.request.abort();
			}
			catch (B) {
			}
			finally {
				this.request = null;
				this.logger.debug("[" + this.identifier + "] : connection aborted");
			}
		}
	}, close:function () {
		if (this.request) {
			try {
				this.request.onreadystatechange = Function.NOOP;
			}
			catch (B) {
			}
			finally {
				this.request = null;
				this.logger.debug("[" + this.identifier + "] : connection closed");
			}
		}
	}});
});
[Ice.Parameter = new Object].as(function (A) {
	A.Query = Object.subclass({initialize:function () {
		this.parameters = [];
	}, add:function (B, C) {
		this.parameters.push(new A.Association(B, C));
		return this;
	}, addParameter:function (B) {
		this.parameters.push(B);
		return this;
	}, addQuery:function (B) {
		B.serializeOn(this);
		return this;
	}, asURIEncodedString:function () {
		return this.parameters.inject("", function (B, C, D) {
			return B += (D == 0) ? C.asURIEncodedString() : "&" + C.asURIEncodedString();
		});
	}, asString:function () {
		return this.parameters.inject("", function (B, D, C) {
			return B + "\n| " + D.asString() + " |";
		});
	}, sendOn:function (B) {
		B.send(this);
	}, serializeOn:function (B) {
		this.parameters.each(function (C) {
			C.serializeOn(B);
		});
	}});
	A.Query.create = function (C) {
		var B = new A.Query;
		C.apply(this, [B]);
		return B;
	};
	A.Association = Object.subclass({initialize:function (B, C) {
		this.name = B;
		this.value = C;
	}, asURIEncodedString:function () {
		return encodeURIComponent(this.name) + "=" + encodeURIComponent(this.value);
	}, asString:function () {
		return this.name + "=" + this.value;
	}, serializeOn:function (B) {
		B.add(this.name, this.value);
	}});
});
[Ice.Geometry = new Object].as(function (A) {
	A.Point = Object.subclass({initialize:function (B, C) {
		this.x = B;
		this.y = C;
	}, asString:function () {
		return "point [" + this.x + ", " + this.y + "]";
	}, toString:function () {
		return this.asString();
	}, serializeOn:function (B) {
		B.add("ice.event.x", this.x);
		B.add("ice.event.y", this.y);
	}});
});
[Ice.ElementModel = new Object].as(function (This) {
	This.TemporaryContainer = function () {
		var container = document.body.appendChild(document.createElement("div"));
		container.style.visibility = "hidden";
		container.style.display = "none";
		This.TemporaryContainer = function () {
			return container;
		};
		return container;
	};
	This.Update = Object.subclass({initialize:function (element) {
		this.element = element;
		var tag = element.getAttribute("tag");
		this.startTag = function (html) {
			html.push("<");
			html.push(tag);
			this.eachAttribute(function (name, value) {
				html.push(" ");
				html.push(name);
				html.push("=\"");
				html.push(value);
				html.push("\"");
			});
			html.push(">");
		};
		this.endTag = function (html) {
			html.push("</");
			html.push(tag);
			html.push(">");
		};
	}, eachAttribute:function (iterator) {
		$enumerate(this.element.getElementsByTagName("attribute")).each(function (attribute) {
			var value = attribute.firstChild ? attribute.firstChild.data : "";
			iterator(attribute.getAttribute("name"), value);
		});
	}, content:function () {
		var contentElement = this.element.getElementsByTagName("content")[0];
		return contentElement.firstChild ? contentElement.firstChild.data.replace(/<\!\#cdata\#/g, "<![CDATA[").replace(/\#\#>/g, "]]>") : "";
	}, asHTML:function () {
		var html = [];
		this.startTag(html);
		html.push(this.content());
		this.endTag(html);
		return html.join("");
	}, asString:function () {
		var html = [];
		this.startTag(html);
		html.push("...");
		this.endTag(html);
		return html.join("");
	}});
	This.Element = Object.subclass({MouseListenerNames:["onClick", "onDblClick", "onMouseDown", "onMouseMove", "onMouseOut", "onMouseOver", "onMouseUp"], KeyListenerNames:["onKeyDown", "onKeyPress", "onKeyUp", "onHelp"], initialize:function (element) {
		this.element = element;
	}, id:function () {
		return this.element.id;
	}, isSubmit:function () {
		return false;
	}, form:function () {
		var parent = this.element.parentNode;
		while (parent) {
			if (parent.tagName && parent.tagName.toLowerCase() == "form") {
				return This.Element.adaptToElement(parent);
			}
			parent = parent.parentNode;
		}
		throw "Cannot find enclosing form.";
	}, updateDOM:function (update) {
		this.replaceHtml(update.asHTML());
	}, replaceHtml:function (html) {
		this.withTemporaryContainer(function (container) {
			container.innerHTML = html;
			var newElement = container.firstChild;
			this.disconnectEventListeners();
			this.replaceHostElementWith(newElement);
		});
	}, disconnectEventListeners:function () {
		if (this.element.bridge) {
			this.element.bridge.dispose();
		}
		var elements = this.element.getElementsByTagName("*");
		var length = elements.length;
		for (var i = 0; i < length; i++) {
			var element = elements[i];
			$element(element).eachListenerName(function (listenerName) {
				element[listenerName.toLowerCase()] = null;
			});
		}
	}, serializeOn:function (query) {
	}, sendOn:function (connection) {
		Query.create(function (query) {
			this.serializeOn(query);
		}.bind(this)).sendOn(connection);
	}, send:function () {
		this.sendOn(connection);
	}, withTemporaryContainer:function (execute) {
		try {
			execute.apply(this, [This.TemporaryContainer()]);
		}
		finally {
			This.TemporaryContainer().innerHTML = "";
		}
	}, defaultReplaceHostElementWith:function (newElement) {
		this.displayOff();
		this.element.parentNode.replaceChild(newElement, this.element);
		this.element = newElement;
	}, replaceHostElementWith:function (newElement) {
		this.defaultReplaceHostElementWith(newElement);
	}, displayOff:/Safari/.test(navigator.userAgent) ? Function.NOOP : function () {
		this.element.style.display = "none";
	}, eachListenerName:function (iterator) {
		this.MouseListenerNames.each(iterator);
		this.KeyListenerNames.each(iterator);
	}, findBridge:function () {
		return this.findContainerFor("bridge").bridge;
	}, findConnection:function () {
		return this.findBridge().connection;
	}, findContainerFor:function (property) {
		var parent = this.element;
		while (parent) {
			if (parent[property]) {
				return parent;
			} else {
				parent = parent.parentNode;
			}
		}
		throw "couldn't find container for property: " + property;
	}});
	This.Element.adaptToElement = function (e) {
		if (!e) {
			return new This.Element(e);
		}
		switch (e.tagName.toLowerCase()) {
		  case "textarea":
		  case "input":
			return new This.InputElement(e);
		  case "thead":
		  case "tfoot":
		  case "tbody":
		  case "th":
		  case "td":
		  case "tr":
			return new This.TableCellElement(e);
		  case "button":
			return new This.ButtonElement(e);
		  case "select":
			return new This.SelectElement(e);
		  case "form":
			return new This.FormElement(e);
		  case "body":
			return new This.BodyElement(e);
		  case "script":
			return new This.ScriptElement(e);
		  case "title":
			return new This.TitleElement(e);
		  case "a":
			return new This.AnchorElement(e);
		  case "iframe":
			return new This.IFrameElement(e);
		  default:
			return new This.Element(e);
		}
	};
	This.ElementStyleProperties = ["background", "backgroundAttachment", "backgroundColor", "backgroundImage", "backgroundPosition", "backgroundRepeat", "border", "borderBottom", "borderBottomColor", "borderBottomStyle", "borderBottomWidth", "borderColor", "borderLeft", "borderLeftColor", "borderLeftStyle", "borderLeftWidth", "borderRight", "borderRightColor", "borderRightStyle", "borderRightWidth", "borderStyle", "borderTop", "borderTopColor", "borderTopStyle", "borderTopWidth", "borderWidth", "clear", "clip", "color", "cursor", "display", "filter", "font", "fontFamily", "fontSize", "fontVariant", "fontWeight", "height", "left", "letterSpacing", "lineHeight", "listStyle", "listStyleImage", "listStylePosition", "listStyleType", "margin", "marginBottom", "marginLeft", "marginRight", "marginTop", "overflow", "padding", "paddingBottom", "paddingLeft", "paddingRight", "paddingTop", "pageBreakAfter", "pageBreakBefore", "position", "styleFloat", "textAlign", "textDecoration", "textDecorationBlink", "textDecorationLineThrough", "textDecorationNone", "textDecorationOverline", "textDecorationUnderline", "textIndent", "textTransform", "top", "verticalAlign", "visibility", "width", "zIndex"];
	This.InputElementAttributes = ["className", "title", "lang", "name", "value", "checked", "disabled", "readOnly", "size", "maxLength", "src", "alt", "useMap", "isMap", "tabIndex", "accessKey", "accept"];
	This.InputElement = This.Element.subclass({InputListenerNames:["onBlur", "onFocus", "onChange"], initialize:function (element) {
		this.element = element;
		var type = element.type.toLowerCase();
		this.isSubmitElement = type == "submit" || type == "image" || type == "button";
	}, isSubmit:function () {
		return this.isSubmitElement;
	}, form:function () {
		return This.Element.adaptToElement(this.element.form);
	}, focus:function () {
		var onFocusListener = this.element.onfocus;
		this.element.onfocus = Function.NOOP;
		this.element.focus();
		this.element.onfocus = onFocusListener;
	}, replaceHostElementWith:function (newElement) {
		This.InputElementAttributes.each(function (attributeName) {
			var newValue = newElement[attributeName];
			var oldValue = this.element[attributeName];
			if (oldValue != newValue) {
				this.element[attributeName] = newValue;
			}
		}.bind(this));
		var newStyle = newElement.getAttribute("style");
		var oldStyle = this.element.getAttribute("style");
		var elementStyle = this.element.style;
		var newElementStyle = newElement.style;
		if (newStyle != oldStyle) {
			this.element.setAttribute("style", newStyle);
			This.ElementStyleProperties.each(function (p) {
				if (Prototype.Browser.IE && p === "font" && !newElementStyle[p]) {
				} else {
					elementStyle[p] = newElementStyle[p];
				}
			});
		}
		this.eachListenerName(function (listenerName) {
			var name = listenerName.toLowerCase();
			this.element[name] = newElement[name] ? newElement[name].bind(this.element) : null;
			newElement[name] = null;
		}.bind(this));
	}, serializeOn:function (query) {
		switch (this.element.type.toLowerCase()) {
		  case "image":
		  case "textarea":
		  case "submit":
		  case "hidden":
		  case "password":
		  case "text":
			query.add(this.element.name, this.element.value);
			break;
		  case "checkbox":
		  case "radio":
			if (this.element.checked) {
				query.add(this.element.name, this.element.value || "on");
			}
			break;
		}
	}, eachListenerName:function (iterator) {
		this.MouseListenerNames.each(iterator);
		this.KeyListenerNames.each(iterator);
		this.InputListenerNames.each(iterator);
	}});
	This.SelectElement = This.InputElement.subclass({isSubmit:function () {
		return false;
	}, replaceHostElementWith:function (newElement) {
		this.defaultReplaceHostElementWith(newElement);
	}, serializeOn:function (query) {
		$enumerate(this.element.options).select(function (option) {
			return option.selected;
		}).each(function (selectedOption) {
			var value = selectedOption.value || (selectedOption.value == "" ? "" : selectedOption.text);
			query.add(this.element.name, value);
		}.bind(this));
	}});
	This.ButtonElement = This.InputElement.subclass({initialize:function (element) {
		this.element = element;
		this.isSubmitElement = element.type.toLowerCase() == "submit";
	}, isSubmit:function () {
		return this.isSubmitElement;
	}, replaceHostElementWith:function (newElement) {
		this.defaultReplaceHostElementWith(newElement);
	}, serializeOn:function (query) {
		query.add(this.element.name, this.element.value);
	}});
	This.FormElement = This.Element.subclass({FormListenerNames:["onReset", "onSubmit", "submit"], FormAttributeNames:["acceptcharset", "action", "enctype", "method", "name", "target"], detectDefaultSubmit:function () {
		var formElements = this.element.elements;
		var length = formElements.length;
		var defaultID = this.element.id + ":default";
		for (var i = 0; i < length; i++) {
			var formElement = formElements[i];
			if (formElement.id == defaultID) {
				return This.Element.adaptToElement(formElement);
			}
		}
		return null;
	}, eachFormElement:/Safari/.test(navigator.userAgent) ? function (iterator) {
		var newestElements = [];
		$enumerate(this.element.elements).reverse().each(function (element) {
			if (!newestElements.detect(function (newestElement) {
				return element.id && newestElement.id && newestElement.id == element.id;
			})) {
				newestElements.push(element);
				iterator(This.Element.adaptToElement(element));
			}
		});
	} : function (iterator) {
		$enumerate(this.element.elements).each(function (e) {
			iterator(This.Element.adaptToElement(e));
		});
	}, captureOnSubmit:function () {
		var previousOnSubmit = this.element.onsubmit;
		this.element.onsubmit = function (event) {
			if (previousOnSubmit) {
				previousOnSubmit();
			}
			$event(event).cancelDefaultAction();
			iceSubmit(this, null, event);
		};
	}, redirectSubmit:function () {
		this.element.submit = function () {
			iceSubmit(this, null, null);
		};
	}, captureAndRedirectSubmit:function () {
		this.captureOnSubmit();
		this.redirectSubmit();
	}, updateDOM:function (update) {
		this.disconnectEventListeners();
		this.element.innerHTML = update.content();
		var remove = function (name) {
			this.element[name] = null;
		}.bind(this);
		this.FormAttributeNames.each(function (name) {
			this.element.removeAttribute(name);
		}.bind(this));
		this.eachListenerName(remove);
		update.eachAttribute(function (name, value) {
			try {
				this.element.setAttribute(name, value);
			}
			catch (e) {
				logger.error("failed to set attribute " + name + ":" + value, e);
			}
		}.bind(this));
	}, serializeOn:function (query) {
		this.eachFormElement(function (formElement) {
			if (!formElement.isSubmit()) {
				formElement.serializeOn(query);
			}
		});
	}, eachListenerName:function (iterator) {
		this.MouseListenerNames.each(iterator);
		this.KeyListenerNames.each(iterator);
		this.FormListenerNames.each(iterator);
	}, submit:function () {
		iceSubmit(this.element, null, null);
	}});
	This.BodyElement = This.Element.subclass({replaceHtml:function (html) {
		this.disconnectEventListeners();
		var start = new RegExp("<noscript>", "g").exec(html);
		if (start == null) {
			this.element.innerHTML = html;
		} else {
			var end = new RegExp("</noscript>", "g").exec(html);
			this.element.innerHTML = html.substring(0, start.index) + html.substring(end.index + 11, html.length);
		}
	}});
	This.ScriptElement = This.Element.subclass({updateDOM:function (update) {
		var scriptCode = update.content();
		if (scriptCode != "" && scriptCode != ";") {
			var evalFunc = function () {
				eval(scriptCode);
			};
			evalFunc.apply(window);
		}
	}});
	This.TitleElement = This.Element.subclass({updateDOM:function (update) {
		this.element.ownerDocument.title = update.content();
	}});
	This.AnchorElement = This.Element.subclass({isSubmit:function () {
		return true;
	}, focus:function () {
		var onFocusListener = this.element.onfocus;
		this.element.onfocus = Function.NOOP;
		this.element.focus();
		this.element.onfocus = onFocusListener;
	}, serializeOn:function (query) {
		if (this.element.name) {
			query.add(this.element.name, this.element.name);
		}
	}});
	This.TableCellElement = This.Element.subclass({replaceHtml:function (html) {
		this.withTemporaryContainer(function (container) {
			container.innerHTML = "<TABLE>" + html + "</TABLE>";
			var newElement = container.firstChild;
			while ((null != newElement) && (this.element.id != newElement.id)) {
				newElement = newElement.firstChild;
			}
			this.disconnectEventListeners();
			this.replaceHostElementWith(newElement);
		});
	}});
	This.IFrameElement = This.Element.subclass({replaceHostElementWith:function (newElement) {
		this.eachAttributeName(function (attributeName) {
			var value = newElement.getAttribute(attributeName);
			if (value == null) {
				this.element.removeAttribute(attributeName);
			} else {
				this.element.setAttribute(attributeName, value);
			}
		}.bind(this));
		var oldLocation = this.element.contentWindow.location.href;
		var newLocation = newElement.src;
		if (oldLocation != newLocation) {
			this.element.contentWindow.location = newLocation;
		}
		this.eachListenerName(function (listenerName) {
			var name = listenerName.toLowerCase();
			this.element[name] = newElement[name] ? newElement[name].bind(this.element) : null;
			newElement[name] = null;
		}.bind(this));
	}, eachAttributeName:function (iterator) {
		["title", "lang", "dir", "class", "style", "align", "frameborder", "width", "height", "hspace", "ismap", "longdesc", "marginwidth", "marginheight", "name", "scrolling"].each(iterator);
	}});
	window.$element = This.Element.adaptToElement;
});
[Ice.EventModel = new Object, Ice.ElementModel.Element, Ice.Parameter.Query, Ice.Geometry].as(function (E, B, A, G) {
	E.IE = new Object;
	E.Netscape = new Object;
	E.Event = Object.subclass({initialize:function (I, H) {
		this.event = I;
		this.currentElement = H;
	}, cancel:function () {
		this.cancelBubbling();
		this.cancelDefaultAction();
	}, isKeyEvent:function () {
		return false;
	}, isMouseEvent:function () {
		return false;
	}, captured:function () {
		return this.currentElement ? B.adaptToElement(this.currentElement) : null;
	}, serializeEventOn:function (H) {
		H.add("ice.event.target", this.target() && this.target().id());
		H.add("ice.event.captured", this.captured() && this.captured().id());
		H.add("ice.event.type", "on" + this.event.type);
	}, serializeOn:function (H) {
		this.serializeEventOn(H);
	}, sendOn:function (H) {
		A.create(function (I) {
			I.add("ice.submit.partial", false);
			try {
				this.captured().serializeOn(I);
				this.serializeOn(I);
			}
			catch (J) {
				this.serializeOn(I);
			}
		}.bind(this)).sendOn(H);
	}, sendFullOn:function (H) {
		A.create(function (I) {
			I.add("ice.submit.partial", false);
			try {
				this.captured().serializeOn(I);
				this.form().serializeOn(I);
				this.serializeOn(I);
			}
			catch (J) {
				this.serializeOn(I);
			}
		}.bind(this)).sendOn(H);
	}, sendWithCondition:function (H) {
		if (H(this)) {
			this.send();
		}
	}, send:function () {
		this.cancel();
		this.sendOn(this.captured().findConnection());
	}, sendFull:function () {
		this.cancel();
		this.sendFullOn(this.captured().findConnection());
	}});
	E.IE.Event = E.Event.subclass({target:function () {
		return this.event.srcElement ? B.adaptToElement(this.event.srcElement) : null;
	}, cancelBubbling:function () {
		this.event.cancelBubble = true;
	}, cancelDefaultAction:function () {
		this.event.returnValue = false;
	}});
	E.Netscape.Event = E.Event.subclass({target:function () {
		if (window.blackberry) {
			return this.event.currentTarget ? B.adaptToElement(this.event.currentTarget) : null;
		}
		return this.event.target ? B.adaptToElement(this.event.target) : null;
	}, cancelBubbling:function () {
		this.event.stopPropagation();
	}, cancelDefaultAction:function () {
		this.event.preventDefault();
	}});
	var F = {isAltPressed:function () {
		return this.event.altKey;
	}, isCtrlPressed:function () {
		return this.event.ctrlKey;
	}, isShiftPressed:function () {
		return this.event.shiftKey;
	}, isMetaPressed:function () {
		return this.event.metaKey;
	}, serializeKeyAndMouseEventOn:function (H) {
		H.add("ice.event.alt", this.isAltPressed());
		H.add("ice.event.ctrl", this.isCtrlPressed());
		H.add("ice.event.shift", this.isShiftPressed());
		H.add("ice.event.meta", this.isMetaPressed());
	}};
	var D = {isMouseEvent:function () {
		return true;
	}, serializeOn:function (H) {
		this.serializeEventOn(H);
		this.serializeKeyAndMouseEventOn(H);
		this.pointer().serializeOn(H);
		H.add("ice.event.left", this.isLeftButton());
		H.add("ice.event.right", this.isRightButton());
	}};
	E.IE.MouseEvent = E.IE.Event.subclass({pointer:function () {
		return new G.Point(this.event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft), this.event.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
	}, isLeftButton:function () {
		return this.event.button == 1;
	}, isRightButton:function () {
		return this.event.button == 2;
	}});
	E.IE.MouseEvent.methods(F);
	E.IE.MouseEvent.methods(D);
	E.Netscape.MouseEvent = E.Netscape.Event.subclass({pointer:function () {
		return new G.Point(this.event.pageX, this.event.pageY);
	}, isLeftButton:function () {
		return this.event.which == 1;
	}, isRightButton:function () {
		return this.event.which == 3;
	}});
	E.Netscape.MouseEvent.methods(F);
	E.Netscape.MouseEvent.methods(D);
	var C = {keyCharacter:function () {
		return String.fromCharCode(this.keyCode());
	}, isEnterKey:function () {
		return this.keyCode() == 13;
	}, isEscKey:function () {
		return this.keyCode() == 27;
	}, isBackspaceKey:function () {
		return this.keyCode() == 8;
	}, isDeleteKey:function () {
		return this.keyCode() == 46 || this.keyCode() == 63272;
	}, isSpaceKey:function () {
		return this.keyCode() == 32;
	}, isTabKey:function () {
		return this.keyCode() == 9 || (this.isShiftPressed() && this.keyCode() == 25);
	}, isHomeKey:function () {
		return this.keyCode() == 36 || this.keyCode() == 63273;
	}, isEndKey:function () {
		return this.keyCode() == 35 || this.keyCode() == 63275;
	}, isPageUpKey:function () {
		return this.keyCode() == 33 || this.keyCode() == 63276;
	}, isPageDownKey:function () {
		return this.keyCode() == 34 || this.keyCode() == 63277;
	}, isArrowUpKey:function () {
		return this.keyCode() == 38 || this.keyCode() == 63232;
	}, isArrowDownKey:function () {
		return this.keyCode() == 40 || this.keyCode() == 63233;
	}, isArrowLeftKey:function () {
		return this.keyCode() == 37 || this.keyCode() == 63234;
	}, isArrowRightKey:function () {
		return this.keyCode() == 39 || this.keyCode() == 63235;
	}, isKeyEvent:function () {
		return true;
	}, serializeOn:function (H) {
		this.serializeEventOn(H);
		this.serializeKeyAndMouseEventOn(H);
		H.add("ice.event.keycode", this.keyCode());
	}};
	E.IE.KeyEvent = E.IE.Event.subclass({keyCode:function () {
		return this.event.keyCode;
	}});
	E.IE.KeyEvent.methods(F);
	E.IE.KeyEvent.methods(C);
	E.Netscape.KeyEvent = E.Netscape.Event.subclass({keyCode:function () {
		return this.event.which == 0 ? this.event.keyCode : this.event.which;
	}});
	E.Netscape.KeyEvent.methods(F);
	E.Netscape.KeyEvent.methods(C);
	E.UnknownEvent = E.Event.subclass({initialize:function (H) {
		this.currentElement = H;
	}, target:function () {
		return this.currentElement == null ? null : B.adaptToElement(this.currentElement);
	}, serializeEventOn:function (H) {
		H.add("ice.event.target", this.target() && this.target().id());
		H.add("ice.event.captured", this.captured() && this.captured().id());
		H.add("ice.event.type", "unknown");
	}, cancelBubbling:Function.NOOP, cancelDefaultAction:Function.NOOP});
	E.Event.adaptToPlainEvent = function (I, H) {
		return window.event ? new E.IE.Event(event, H) : new E.Netscape.Event(I, H);
	};
	E.Event.adaptToMouseEvent = function (I, H) {
		return window.event ? new E.IE.MouseEvent(event, H) : new E.Netscape.MouseEvent(I, H);
	};
	E.Event.adaptToKeyEvent = function (I, H) {
		return window.event ? new E.IE.KeyEvent(event, H) : new E.Netscape.KeyEvent(I, H);
	};
	E.Event.adaptToEvent = function (K, H) {
		var J = window.event || K;
		if (J) {
			var I = "on" + J.type;
			var L = function (M) {
				return M.toLowerCase() == I;
			};
			if (B.prototype.KeyListenerNames.detect(L)) {
				return E.Event.adaptToKeyEvent(K, H);
			} else {
				if (B.prototype.MouseListenerNames.detect(L)) {
					return E.Event.adaptToMouseEvent(K, H);
				} else {
					return E.Event.adaptToPlainEvent(K, H);
				}
			}
		} else {
			return new E.UnknownEvent(H);
		}
	};
	window.$event = E.Event.adaptToEvent;
});
[Ice].as(function (A) {
	A.Cookie = A.Parameter.Association.subclass({initialize:function (B, C, D) {
		this.name = B;
		this.value = C || "";
		this.path = D || "/";
		this.save();
	}, saveValue:function (B) {
		this.value = B;
		this.save();
	}, loadValue:function () {
		this.load();
		return this.value;
	}, save:function () {
		document.cookie = this.name + "=" + this.value + "; path=" + this.path;
		return this;
	}, load:function () {
		var B = A.Cookie.parse().detect(function (C) {
			return this.name == C[0];
		}.bind(this));
		this.value = B ? B[1] : null;
		return this;
	}, remove:function () {
		var B = new Date();
		B.setTime(B.getTime() - 24 * 60 * 60 * 1000);
		document.cookie = this.name + "=; expires=" + B.toGMTString() + "; path=" + this.path;
	}});
	A.Cookie.all = function () {
		return A.Cookie.parse().collect(function (B) {
			var C = B[0];
			var D = B[1];
			return new A.Cookie(C, D);
		});
	};
	A.Cookie.lookup = function (B, D) {
		var C = A.Cookie.parse().detect(function (E) {
			return B == E[0];
		});
		if (C) {
			return new A.Cookie(B, C[1]);
		} else {
			if (D) {
				return new A.Cookie(B, D);
			} else {
				throw "Cannot find cookie named: " + B;
			}
		}
	};
	A.Cookie.exists = function (B) {
		return document.cookie.contains(B + "=");
	};
	A.Cookie.parse = function () {
		return document.cookie.split("; ").collect(function (B) {
			return B.contains("=") ? B.split("=") : [B, ""];
		});
	};
});
function currentConnection() {
	var A = $enumerate(arguments).detect(function (B) {
		return !!B;
	});
	return A.findConnection();
}
function formOf(A) {
	var B = A.parentNode;
	while (B) {
		if (B.tagName && B.tagName.toLowerCase() == "form") {
			return B;
		}
		B = B.parentNode;
	}
	throw "Cannot find enclosing form.";
}
function iceSubmitPartial(C, B, A, D) {
	C = (C ? C : B.form);
	if (!D) {
		D = new Ice.Parameter.Query();
	}
	if (Ice.InputFileIdPreUpload) {
		D.add("ice.inputFile.preUpload", Ice.InputFileIdPreUpload);
	}
	if (Ice.InputFileIdPostUpload) {
		D.add("ice.inputFile.postUpload", Ice.InputFileIdPostUpload);
	}
	if (Ice.Menu != null && Ice.Menu.menuContext != null) {
		D.add("ice.menuContext", Ice.Menu.menuContext);
	}
	if (Ice.FCKeditorUtility) {
		Ice.FCKeditorUtility.saveAll();
	}
	D.add("ice.submit.partial", true);
	$event(A, B).serializeOn(D);
	if (C && C.id) {
		$element(C).serializeOn(D);
	}
	if (B && B.id) {
		var E = $element(B);
		if (E.isSubmit()) {
			E.serializeOn(D);
		}
	}
	D.sendOn(currentConnection($element(C), $element(B)));
	resetHiddenFieldsFor(C);
	return false;
}
function iceSubmit(B, D, A, H) {
	B = (B ? B : D.form);
	var F = $event(A, D);
	var E = $element(B);
	if (!H) {
		H = new Ice.Parameter.Query();
	}
	if (Ice.InputFileIdPreUpload) {
		H.add("ice.inputFile.preUpload", Ice.InputFileIdPreUpload);
	}
	if (Ice.InputFileIdPostUpload) {
		H.add("ice.inputFile.postUpload", Ice.InputFileIdPostUpload);
	}
	if (Ice.Menu != null && Ice.Menu.menuContext != null) {
		H.add("ice.menuContext", Ice.Menu.menuContext);
	}
	if (Ice.FCKeditorUtility) {
		Ice.FCKeditorUtility.saveAll();
	}
	H.add("ice.submit.partial", false);
	if (F.isKeyEvent()) {
		if (F.isEnterKey()) {
			var G = E ? E.detectDefaultSubmit() : null;
			F.cancelDefaultAction();
			F.serializeOn(H);
			if (G) {
				G.serializeOn(H);
			}
			if (E) {
				E.serializeOn(H);
			}
			H.sendOn(currentConnection($element(B), $element(D)));
		}
	} else {
		var C = D && D.id ? $element(D) : null;
		F.serializeOn(H);
		if (C && C.isSubmit()) {
			C.serializeOn(H);
		}
		if (E) {
			E.serializeOn(H);
		}
		H.sendOn(currentConnection($element(B), $element(D)));
	}
	resetHiddenFieldsFor(B);
	return false;
}
function resetHiddenFieldsFor(A) {
	$enumerate(A.elements).each(function (B) {
		if (B.type == "hidden" && B.id == "") {
			B.value = "";
		}
	});
}
[Ice.Document = new Object, Ice.ElementModel.Element, Ice.Connection, Ice.Ajax].as(function (D, A, C, B) {
	D.replaceContainerHTML = function (H, I) {
		var L = new RegExp("<body[^<]*>", "g").exec(I);
		var G = new RegExp("</body>", "g").exec(I);
		var F = I.substring(L.index, G.index + G[0].length);
		var K = F.substring(F.indexOf(">") + 1, F.lastIndexOf("<"));
		var E = H.tagName;
		var J = $element(H);
		J.disconnectEventListeners();
		J.replaceHtml(["<", E, ">", K, "</", E, ">"].join(""));
	};
	D.Synchronizer = Object.subclass({initialize:function (E, G, I) {
		this.logger = E.child("synchronizer");
		this.ajax = new B.Client(this.logger);
		var H = "history-frame:" + G + ":" + I;
		try {
			window.frames[H].location.hash;
			this.historyFrame = window.frames[H];
		}
		catch (F) {
			this.historyFrame = H.asElement().contentWindow;
		}
		try {
			if (this.historyFrame.location.hash.length > 0) {
				this.reload();
			}
		}
		catch (F) {
			this.logger.error("History frame reload failed: " + F);
		}
	}, synchronize:function () {
		this.synchronize = Function.NOOP;
		try {
			if (!this.historyFrame.location.hash.contains("reload")) {
				this.historyFrame.location.replace(this.historyFrame.location + "#reload");
				this.logger.debug("mark document as modified");
			}
		}
		catch (E) {
			this.logger.warn("could not mark document as modified", E);
		}
	}, reload:function () {
		try {
			this.logger.info("synchronize body");
			this.ajax.getAsynchronously(document.URL, "", function (F) {
				F.setRequestHeader("Connection", "close");
				F.on(C.OK, function (G) {
					D.replaceContainerHTML(document.body, G.content());
				});
			});
		}
		catch (E) {
			this.logger.error("failed to reload body", E);
		}
	}, shutdown:function () {
		this.synchronize = Function.NOOP;
	}});
});
[Ice.Command = new Object].as(function (A) {
	A.Dispatcher = Object.subclass({initialize:function () {
		this.commands = new Object;
	}, register:function (B, C) {
		this.commands[B] = C;
	}, deserializeAndExecute:function (D) {
		var B = D.tagName;
		for (var C in this.commands) {
			if (C == B) {
				this.commands[B](D);
				return;
			}
		}
		throw "Unknown message received: " + B;
	}});
	A.SetCookie = function (B) {
		document.cookie = B.firstChild.data;
	};
	A.ParsingError = function (C) {
		logger.error("Parsing error");
		var D = C.firstChild;
		logger.error(D.data);
		var B = D.firstChild;
		logger.error(B.data);
	};
});
[Ice.Script = new Object, Ice.Ajax.Client].as(function (This, Client) {
	This.Loader = Object.subclass({initialize:function (logger) {
		this.logger = logger.child("script-loader");
		this.referencedScripts = [];
		this.client = new Client(this.logger);
		$enumerate(document.documentElement.getElementsByTagName("script")).each(function (script) {
			if (script.src) {
				this.referencedScripts.push(script.src);
			}
		}.bind(this));
	}, searchAndEvaluateScripts:function (element) {
		$enumerate(element.getElementsByTagName("script")).each(function (s) {
			this.evaluateScript(s);
		}.bind(this));
	}, evaluateScript:function (script) {
		var uri = script.src;
		if (uri) {
			if (!this.referencedScripts.include(script.src)) {
				this.logger.debug("loading : " + uri);
				this.client.getSynchronously(uri, "", function (request) {
					request.on(Ice.Connection.OK, function () {
						this.referencedScripts.push(uri);
						this.logger.debug("evaluating script at : " + uri);
						try {
							eval(request.content());
						}
						catch (e) {
							this.logger.warn("Failed to evaluate script located at: " + uri, e);
						}
					}.bind(this));
				}.bind(this));
			}
		} else {
			var code = script.innerHTML;
			this.logger.debug("evaluating script : " + code);
			try {
				eval(code);
			}
			catch (e) {
				this.logger.warn("Failed to evaluate script: \n" + code, e);
			}
		}
	}});
});
var currentFocus;
function setFocus(A) {
	currentFocus = A;
}
[Ice.Focus = new Object].as(function (D) {
	function C(E) {
		return /^\w[\w\-\:]*$/.test(E);
	}
	D.setFocus = (function (F) {
		if (F && C(F)) {
			try {
				F.asExtendedElement().focus();
				setFocus(F);
				var E = document.getElementById(F);
				if (E) {
					E.focus();
				} else {
					logger.info("Cannot set focus, no element for id [" + F + "]");
				}
				logger.debug("Focus Set on [" + F + "]");
			}
			catch (E) {
				logger.info("Cannot set focus, no element for id [" + F + "]", E);
			}
		} else {
			logger.debug("Focus interupted. Not Set on [" + F + "]");
		}
	}).delayFor(100);
	function B(F, E, G) {
		var H = F[E];
		if (H) {
			F[E] = function (J) {
				var I = [J];
				H.apply(F, I);
				G.apply(F, I);
			};
		} else {
			F[E] = G;
		}
	}
	function A(G) {
		var E = G || window.event;
		var F = E.srcElement || E.target;
		setFocus(F.id);
	}
	D.captureFocusIn = function (E) {
		$enumerate(["select", "input", "button", "a"]).each(function (F) {
			$enumerate(E.getElementsByTagName(F)).each(function (G) {
				B(G, "onfocus", A);
			});
		});
	};
	window.onLoad(function () {
		D.captureFocusIn(document);
	});
});
[Ice.Status = new Object].as(function (A) {
	A.NOOPIndicator = {on:Function.NOOP, off:Function.NOOP};
	A.RedirectIndicator = Object.subclass({initialize:function (B) {
		this.uri = B;
	}, on:function () {
		window.location.href = this.uri;
	}, off:Function.NOOP});
	A.ElementIndicator = Object.subclass({initialize:function (B, C) {
		this.elementID = B;
		this.indicators = C;
		this.indicators.push(this);
		this.off();
	}, on:function () {
		this.indicators.each(function (C) {
			if (C != this) {
				C.off();
			}
		}.bind(this));
		var B = this.elementID.asElement();
		if (B) {
			B.style.visibility = "visible";
		}
	}, off:function () {
		var B = this.elementID.asElement();
		if (B) {
			B.style.visibility = "hidden";
		}
	}});
	A.OverlappingStateProtector = Object.subclass({initialize:function (B) {
		this.indicator = B;
		this.counter = 0;
	}, on:function () {
		if (this.counter == 0) {
			this.indicator.on();
		}
		++this.counter;
	}, off:function () {
		if (this.counter < 1) {
			return;
		}
		if (this.counter == 1) {
			this.indicator.off();
		}
		--this.counter;
	}});
	A.ToggleIndicator = Object.subclass({initialize:function (B, C) {
		this.onElement = B;
		this.offElement = C;
		this.off();
	}, on:function () {
		this.onElement.on();
		this.offElement.off();
	}, off:function () {
		this.onElement.off();
		this.offElement.on();
	}});
	A.MuxIndicator = Object.subclass({initialize:function () {
		this.indicators = arguments;
		this.off();
	}, on:function () {
		$enumerate(this.indicators).each(function (B) {
			B.on();
		});
	}, off:function () {
		$enumerate(this.indicators).each(function (B) {
			B.off();
		});
	}});
	A.PointerIndicator = Object.subclass({initialize:function (B) {
		this.toggle = function () {
			this.on = Function.NOOP;
			var C = ["input", "select", "textarea", "button", "a"].inject([B], function (D, E) {
				return D.concat($enumerate(B.getElementsByTagName(E)).toArray());
			}).collect(function (D) {
				var E = D.style.cursor;
				D.style.cursor = "wait";
				return function () {
					D.style.cursor = E;
				};
			});
			this.off = function () {
				C.broadcast();
				this.on = this.toggle;
				this.off = Function.NOOP;
			};
		};
		this.on = /Safari/.test(navigator.userAgent) ? Function.NOOP : this.toggle;
		this.off = Function.NOOP;
	}});
	A.OverlayIndicator = Object.subclass({initialize:function (B) {
		this.configuration = B;
	}, on:function () {
		if (/MSIE/.test(navigator.userAgent)) {
			this.overlay = document.createElement("iframe");
			this.overlay.setAttribute("src", this.configuration.connection.context + "xmlhttp/wait-cursor");
			this.overlay.setAttribute("frameborder", "0");
			document.body.appendChild(this.overlay);
		} else {
			this.overlay = document.body.appendChild(document.createElement("div"));
			this.overlay.style.cursor = "wait";
		}
		var B = this.overlay.style;
		B.position = "absolute";
		B.backgroundColor = "white";
		B.zIndex = "38000";
		B.top = "0";
		B.left = "0";
		B.opacity = "0";
		B.filter = "alpha(opacity=0)";
		B.width = (Math.max(document.documentElement.scrollWidth, document.body.scrollWidth) - 20) + "px";
		B.height = (Math.max(document.documentElement.scrollHeight, document.body.scrollHeight) - 20) + "px";
	}, off:function () {
		if (this.overlay) {
			if (/MSIE/.test(navigator.userAgent)) {
				var B = document.createElement("iframe");
				B.setAttribute("src", this.configuration.connection.context + "xmlhttp/blank");
				B.setAttribute("frameborder", "0");
				document.body.replaceChild(B, this.overlay);
				document.body.removeChild(B);
			} else {
				document.body.removeChild(this.overlay);
			}
		}
	}});
	A.PopupIndicator = Object.subclass({initialize:function (F, E, D, C, B) {
		this.message = F;
		this.description = E;
		this.buttonText = D;
		this.iconPath = C;
		this.panel = B;
	}, on:function () {
		this.panel.on();
		var C = document.createElement("div");
		document.body.appendChild(C);
		var B = C.style;
		B.position = "absolute";
		B.textAlign = "center";
		B.zIndex = "28001";
		B.color = "black";
		B.backgroundColor = "white";
		B.paddingLeft = "0";
		B.paddingRight = "0";
		B.paddingTop = "15px";
		B.paddingBottom = "15px";
		B.borderBottomColor = "gray";
		B.borderRightColor = "gray";
		B.borderTopColor = "silver";
		B.borderLeftColor = "silver";
		B.borderWidth = "2px";
		B.borderStyle = "solid";
		B.width = "270px";
		var F = document.createElement("div");
		F.appendChild(document.createTextNode(this.message));
		var I = F.style;
		I.marginLeft = "30px";
		I.textAlign = "left";
		I.fontSize = "14px";
		I.fontSize = "14px";
		I.fontWeight = "bold";
		C.appendChild(F);
		var E = document.createElement("div");
		E.appendChild(document.createTextNode(this.description));
		var H = E.style;
		H.fontSize = "11px";
		H.marginTop = "7px";
		H.marginBottom = "7px";
		H.fontWeight = "normal";
		F.appendChild(E);
		var G = document.createElement("input");
		G.type = "button";
		G.value = this.buttonText;
		var J = G.style;
		J.fontSize = "11px";
		J.fontWeight = "normal";
		G.onclick = function () {
			window.location.reload();
		};
		C.appendChild(G);
		var D = function () {
			B.left = ((window.width() - C.clientWidth) / 2) + "px";
			B.top = ((window.height() - C.clientHeight) / 2) + "px";
		}.bind(this);
		D();
		window.onResize(D);
	}, off:Function.NOOP});
	A.DefaultStatusManager = Object.subclass({initialize:function (G, D) {
		this.configuration = G;
		this.container = D;
		this.connectionLostRedirect = G.connectionLostRedirectURI ? new A.RedirectIndicator(G.connectionLostRedirectURI) : null;
		this.sessionExpiredRedirect = G.sessionExpiredRedirectURI ? new A.RedirectIndicator(G.sessionExpiredRedirectURI) : null;
		var F = G.messages;
		var C = G.connection.context + "/xmlhttp/css/xp/css-images/connect_disconnected.gif";
		var E = G.connection.context + "/xmlhttp/css/xp/css-images/connect_caution.gif";
		var B = new A.PointerIndicator(D);
		this.busy = new A.OverlappingStateProtector(G.blockUI ? new A.MuxIndicator(B, new A.OverlayIndicator(G)) : B);
		this.sessionExpired = this.sessionExpiredRedirect ? this.sessionExpiredRedirect : new A.PopupIndicator(F.sessionExpired, F.description, F.buttonText, C, this);
		this.connectionLost = this.connectionLostRedirect ? this.connectionLostRedirect : new A.PopupIndicator(F.connectionLost, F.description, F.buttonText, E, this);
		this.serverError = new A.PopupIndicator(F.serverError, F.description, F.buttonText, E, this);
		this.connectionTrouble = {on:Function.NOOP, off:Function.NOOP};
	}, on:function () {
		var D = this.container.ownerDocument.createElement("iframe");
		D.setAttribute("src", this.configuration.connection.context + "xmlhttp/blank");
		D.setAttribute("frameborder", "0");
		var B = D.style;
		B.position = "absolute";
		B.display = "block";
		B.visibility = "visible";
		B.backgroundColor = "white";
		B.zIndex = "28000";
		B.top = "0";
		B.left = "0";
		B.opacity = 0.22;
		B.filter = "alpha(opacity=22)";
		this.container.appendChild(D);
		var C = this.container.tagName.toLowerCase() == "body" ? function () {
			B.width = Math.max(document.documentElement.scrollWidth, document.body.scrollWidth) + "px";
			B.height = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight) + "px";
		} : function () {
			B.width = this.container.offsetWidth + "px";
			B.height = this.container.offsetHeight + "px";
		};
		C();
		window.onResize(C);
	}, off:Function.NOOP});
	A.ComponentStatusManager = Object.subclass({initialize:function (F, N, J, E, H, B, M) {
		var L = [];
		var C = new Ice.Status.ElementIndicator(F, L);
		var I = new Ice.Status.ElementIndicator(N, L);
		var D = new Ice.Status.ElementIndicator(E, L);
		var K = new Ice.Status.ToggleIndicator(C, I);
		var G = H.configuration.blockUI ? new Ice.Status.MuxIndicator(K, new Ice.Status.OverlayIndicator(H.configuration)) : K;
		this.busy = new Ice.Status.OverlappingStateProtector(M ? new Ice.Status.MuxIndicator(H.busy, G) : G);
		this.connectionTrouble = new Ice.Status.ElementIndicator(J, L);
		if (B) {
			this.dsm = H;
			this.connectionLost = new Ice.Status.MuxIndicator(D, this.dsm.connectionLost);
			this.sessionExpired = new Ice.Status.MuxIndicator(D, this.dsm.sessionExpired);
			this.serverError = new Ice.Status.MuxIndicator(D, this.dsm.serverError);
		} else {
			this.connectionLost = H.connectionLostRedirect ? H.connectionLostRedirect : D;
			this.sessionExpired = H.sessionExpiredRedirect ? H.sessionExpiredRedirect : D;
			this.serverError = D;
		}
	}, on:function () {
		this.dsm.on();
	}, off:function () {
		[this.busy, this.sessionExpired, this.serverError, this.connectionLost, this.connectionTrouble].eachWithGuard(function (B) {
			B.off();
		});
	}});
});
[Ice.Connection = new Object, Ice.Connection, Ice.Ajax, Ice.Parameter.Query].as(function (D, C, B, A) {
	D.FormPost = function (E) {
		E.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
	};
	D.Close = function (E) {
		E.close();
	};
	D.BadResponse = function (E) {
		return E.statusCode() == 0;
	};
	D.ServerError = function (E) {
		var F = E.statusCode();
		return F >= 500 && F < 600;
	};
	D.OK = function (E) {
		return E.statusCode() == 200;
	};
	D.Lock = Object.subclass({initialize:function () {
		var E = false;
		this.acquire = function () {
			E = true;
		}.bind(this);
		this.release = function () {
			E = false;
		}.bind(this);
		this.isReleased = function () {
			return !E;
		}.bind(this);
	}});
	D.NOOPLock = Object.subclass({initialize:function () {
		this.acquire = Function.NOOP;
		this.release = Function.NOOP;
		this.isReleased = function () {
			return true;
		};
	}});
	D.SyncConnection = Object.subclass({initialize:function (F, I, E, H) {
		this.logger = F.child("sync-connection");
		this.channel = new B.Client(this.logger);
		this.defaultQuery = E;
		this.onSendListeners = [];
		this.onReceiveFromSendListeners = [];
		this.onReceiveListeners = [];
		this.onServerErrorListeners = [];
		this.connectionDownListeners = [];
		this.timeoutBomb = {cancel:Function.NOOP};
		this.logger.info("synchronous mode");
		this.sendURI = I.sendReceiveUpdatesURI;
		var G = I.timeout ? I.timeout : 60000;
		window.onBeforeUnload(function () {
			this.connectionDownListeners.clear();
		}.bind(this));
		this.onSend(function () {
			this.timeoutBomb.cancel();
			this.timeoutBomb = this.connectionDownListeners.broadcaster().delayExecutionFor(G);
		}.bind(this));
		this.onReceive(function () {
			this.timeoutBomb.cancel();
		}.bind(this));
		this.whenDown(function () {
			this.timeoutBomb.cancel();
		}.bind(this));
		this.receiveCallback = function (J) {
			try {
				this.onReceiveListeners.broadcast(J);
			}
			catch (K) {
				this.logger.error("receive broadcast failed", K);
			}
		}.bind(this);
		this.badResponseCallback = this.connectionDownListeners.broadcaster();
		this.serverErrorCallback = this.onServerErrorListeners.broadcaster();
		this.lock = I.blockUI ? new C.Lock() : new C.NOOPLock();
	}, send:function (F) {
		if (this.lock.isReleased()) {
			this.lock.acquire();
			try {
				var E = new A();
				E.addQuery(F);
				E.addQuery(this.defaultQuery);
				E.add("ice.focus", window.currentFocus);
				this.logger.debug("send > " + E.asString());
				this.channel.postAsynchronously(this.sendURI, E.asURIEncodedString(), function (H) {
					D.FormPost(H);
					H.on(C.OK, this.lock.release);
					H.on(C.OK, this.onReceiveFromSendListeners.broadcaster());
					H.on(C.OK, this.receiveCallback);
					H.on(C.BadResponse, this.badResponseCallback);
					H.on(C.ServerError, this.serverErrorCallback);
					H.on(C.OK, C.Close);
					this.onSendListeners.broadcast(H);
				}.bind(this));
			}
			catch (G) {
				this.lock.release();
			}
		}
	}, onSend:function (F, E) {
		this.onSendListeners.push(F);
		if (E) {
			this.onReceiveFromSendListeners.push(E);
		}
	}, onReceive:function (E) {
		this.onReceiveListeners.push(E);
	}, onServerError:function (E) {
		this.onServerErrorListeners.push(E);
	}, whenDown:function (E) {
		this.connectionDownListeners.push(E);
	}, whenTrouble:Function.NOOP, shutdown:function () {
		this.shutdown = Function.NOOP;
		this.send = Function.NOOP;
		[this.onSendListeners, this.onReceiveListeners, this.onServerErrorListeners, this.connectionDownListeners, this.onReceiveFromSendListeners].eachWithGuard(function (E) {
			E.clear();
		});
	}});
});
Ice.Community = new Object;
[Ice.Reliability = new Object].as(function (A) {
	A.Heartbeat = Object.subclass({initialize:function (D, C, B) {
		this.period = D;
		this.logger = B.child("heartbeat");
		this.pingListeners = [];
		this.lostPongListeners = [];
		this.beat = function () {
			var E = function () {
				this.logger.warn("pong lost");
				this.lostPongListeners.each(function (F) {
					F.notify();
				});
			}.bind(this).delayExecutionFor(C);
			this.pingListeners.broadcast(new A.Ping(E, this, this.logger));
		}.bind(this);
		window.onKeyPress(function (E) {
			if (E.keyCode() == 46 && E.isCtrlPressed() && E.isShiftPressed()) {
				this.beatPID ? this.stop() : this.start();
			}
		}.bind(this));
	}, start:function () {
		this.beatPID = this.beat.repeatExecutionEvery(this.period);
		this.logger.info("heartbeat started");
		return this;
	}, stop:function () {
		try {
			this.beatPID.cancel();
			this.beatPID = null;
			this.pingListeners.clear();
			this.lostPongListeners.each(function (C) {
				C.ignoreNotifications();
			});
			this.logger.info("heartbeat stopped");
		}
		catch (B) {
			this.logger.warn("heartbeat not started", B);
		}
		return this;
	}, reset:function () {
		this.lostPongListeners.each(function (B) {
			B.reset();
		});
	}, onPing:function (B) {
		this.pingListeners.push(B);
	}, onLostPongs:function (D, C) {
		var B = C || 1;
		this.lostPongListeners.push(new A.CoalescingListener(B, D));
	}});
	A.Ping = Object.subclass({initialize:function (B, D, C) {
		this.pid = B;
		this.heartbeat = D;
		this.logger = C;
		this.logger.info("ping");
	}, pong:function () {
		if (this.pid) {
			this.heartbeat.reset();
			this.pid.cancel();
			this.pong = Function.NOOP;
			this.logger.info("pong");
		}
	}});
	A.CoalescingListener = Object.subclass({initialize:function (B, C) {
		this.count = 0;
		this.retries = B;
		this.callback = C;
	}, notify:function () {
		this.count += 1;
		if (this.count == this.retries) {
			this.callback();
			this.reset();
		}
	}, ignoreNotifications:function () {
		this.notify = Function.NOOP;
	}, reset:function () {
		this.count = 0;
	}});
});
[Ice.Community.Connection = new Object, Ice.Connection, Ice.Ajax, Ice.Reliability.Heartbeat, Ice.Cookie, Ice.Parameter.Query].as(function (F, E, C, D, A, B) {
	F.AsyncConnection = Object.subclass({initialize:function (g, U, Z, V, M, Y) {
		this.logger = g.child("async-connection");
		this.sendChannel = new C.Client(this.logger.child("ui"));
		this.receiveChannel = new C.Client(this.logger.child("blocking"));
		this.defaultQuery = M;
		this.onSendListeners = [];
		this.onReceiveFromSendListeners = [];
		this.onReceiveListeners = [];
		this.onServerErrorListeners = [];
		this.connectionDownListeners = [];
		this.connectionTroubleListeners = [];
		this.listener = {close:Function.NOOP, abort:Function.NOOP};
		this.listening = {remove:Function.NOOP};
		this.timeoutBomb = {cancel:Function.NOOP};
		this.heartbeat = {stop:Function.NOOP};
		this.pingURI = V.pingURI;
		this.getURI = V.receiveUpdatesURI;
		this.sendURI = V.sendReceiveUpdatesURI;
		this.receiveURI = V.receiveUpdatedViewsURI;
		window.onBeforeUnload(function () {
			this.connectionDownListeners.clear();
		}.bind(this));
		var Q = V.timeout ? V.timeout : 60000;
		this.onSend(function () {
			this.timeoutBomb.cancel();
			this.timeoutBomb = this.connectionDownListeners.broadcaster().delayExecutionFor(Q);
		}.bind(this));
		this.onReceive(function () {
			this.timeoutBomb.cancel();
		}.bind(this));
		this.serverErrorCallback = this.onServerErrorListeners.broadcaster();
		this.receiveCallback = function (i) {
			try {
				this.onReceiveListeners.broadcast(i);
			}
			catch (j) {
				this.logger.error("receive broadcast failed", j);
			}
		}.bind(this);
		this.sendXWindowCookie = Function.NOOP;
		this.receiveXWindowCookie = function (e) {
			var i = e.getResponseHeader("X-Set-Window-Cookie");
			if (i) {
				this.sendXWindowCookie = function (j) {
					j.setRequestHeader("X-Window-Cookie", i);
				};
			}
		}.bind(this);
		try {
			this.updatedViews = A.lookup("updates");
		}
		catch (b) {
			this.updatedViews = new A("updates", "");
		}
		Y.register("updated-views", function (i) {
			var e = this.updatedViews.loadValue().split(" ");
			var j = i.firstChild;
			if (j && !j.data.blank()) {
				this.updatedViews.saveValue(e.concat(j.data.split(" ")).asSet().join(" "));
			} else {
				this.logger.warn("No updated views were returned.");
			}
		}.bind(this));
		try {
			this.listening = A.lookup("bconn");
			this.listening.remove();
		}
		catch (b) {
		}
		var h = function (k, e, i) {
			var j = 0;
			var l = i.inject([e], function (n, m) {
				n.unshift(k.delayFor(m));
				return n;
			});
			return function () {
				if (j < l.length) {
					l[j].apply(this, arguments);
					j++;
				}
			};
		};
		function a() {
			return A.lookup("ice.sessions").loadValue().split(" ").collect(function (e) {
				return e.split("#")[0];
			});
		}
		this.connect = function () {
			this.logger.debug("closing previous connection...");
			this.listener.close();
			this.logger.debug("connect...");
			var e = new B();
			a().each(function (i) {
				e.add("ice.session", i);
			});
			this.listener = this.receiveChannel.postAsynchronously(this.receiveURI, e.asURIEncodedString(), function (i) {
				this.sendXWindowCookie(i);
				E.FormPost(i);
				i.on(E.ServerError, K);
				i.on(E.OK, this.receiveXWindowCookie);
				i.on(E.OK, function (j) {
					if (!j.isEmpty()) {
						this.receiveCallback(j);
					}
					if (j.getResponseHeader("X-Connection") != "close") {
						this.connect();
					} else {
						this.heartbeat.stop();
					}
				}.bind(this));
				i.on(E.OK, E.Close);
			}.bind(this));
		}.bind(this);
		var K = h(this.connect, this.serverErrorCallback, V.serverErrorRetryTimeouts || [1000, 2000, 4000]);
		Y.register("pong", Function.NOOP);
		var H = V.heartbeat.interval ? V.heartbeat.interval : 50000;
		var L = V.heartbeat.timeout ? V.heartbeat.timeout : 30000;
		var c = V.heartbeat.retries ? V.heartbeat.retries : 3;
		var R = function () {
			this.heartbeat.stop();
			this.heartbeat = new D(H, L, this.logger);
			this.heartbeat.onPing(function (e) {
				Y.register("pong", function () {
					e.pong();
				});
				this.sendChannel.postAsynchronously(this.pingURI, this.defaultQuery.asURIEncodedString(), function (i) {
					E.FormPost(i);
					i.on(E.OK, this.receiveCallback);
					i.on(E.OK, E.Close);
				}.bind(this));
			}.bind(this));
			this.heartbeat.onLostPongs(this.connectionDownListeners.broadcaster(), c);
			this.heartbeat.onLostPongs(this.connectionTroubleListeners.broadcaster());
			this.heartbeat.onLostPongs(function () {
				this.logger.debug("retry to connect...");
				this.connect();
			}.bind(this));
			this.heartbeat.start();
			this.connect();
		}.bind(this);
		var P = 1000;
		var f = U + ":" + Z;
		var d = A.lookup("ice.lease", (new Date).getTime().toString());
		var W = this.listening = A.lookup("bconn", "-");
		function J() {
			d.saveValue((new Date).getTime() + P * 2);
		}
		function G() {
			return d.loadValue().asNumber() < (new Date).getTime();
		}
		function I() {
			return !A.exists("bconn") || A.lookup("bconn").value == "-";
		}
		function N() {
			W.saveValue(f);
		}
		function S() {
			return W.loadValue().startsWith(f);
		}
		function O() {
			W.saveValue(f + ":acquired");
		}
		function X() {
			return W.loadValue().endsWith(":acquired");
		}
		this.blockingConnectionMonitor = function () {
			try {
				if (I()) {
					N();
					this.logger.info("blocking connection not initialized...candidate for its creation");
				} else {
					if (S()) {
						if (!X()) {
							O();
							R();
						}
						J();
					}
					if (X() && G()) {
						N();
						this.logger.info("blocking connection lease expired...candidate for its creation");
					}
				}
			}
			catch (i) {
				this.logger.info("could not determine the state of the blocking connection...retrying", i);
			}
		}.bind(this).repeatExecutionEvery(P);
		var T = function () {
			this.sendChannel.postAsynchronously(this.getURI, this.defaultQuery.asURIEncodedString(), function (e) {
				E.FormPost(e);
				e.on(E.OK, this.receiveCallback);
				e.on(E.OK, E.Close);
			}.bind(this));
		}.bind(this);
		T.delayExecutionFor(P);
		this.updatesMonitor = function () {
			try {
				var i = this.updatedViews.loadValue().split(" ");
				if (i.include(f)) {
					T();
					this.updatedViews.saveValue(i.complement([f]).join(" "));
				}
			}
			catch (j) {
				this.logger.warn("failed to listen for updates", j);
			}
		}.bind(this).repeatExecutionEvery(300);
		this.lock = V.blockUI ? new E.Lock() : new E.NOOPLock();
		this.logger.info("asynchronous mode");
	}, send:function (H) {
		if (this.lock.isReleased()) {
			this.lock.acquire();
			try {
				var G = new B();
				G.addQuery(H);
				G.addQuery(this.defaultQuery);
				G.add("ice.focus", window.currentFocus);
				this.logger.debug("send > " + G.asString());
				this.sendChannel.postAsynchronously(this.sendURI, G.asURIEncodedString(), function (J) {
					E.FormPost(J);
					J.on(E.OK, this.lock.release);
					J.on(E.OK, this.onReceiveFromSendListeners.broadcaster());
					J.on(E.OK, this.receiveCallback);
					J.on(E.ServerError, this.serverErrorCallback);
					J.on(E.OK, E.Close);
					this.onSendListeners.broadcast();
				}.bind(this));
			}
			catch (I) {
				this.lock.release();
			}
		}
	}, onSend:function (H, G) {
		this.onSendListeners.push(H);
		if (G) {
			this.onReceiveFromSendListeners.push(G);
		}
	}, onReceive:function (G) {
		this.onReceiveListeners.push(G);
	}, onServerError:function (G) {
		this.onServerErrorListeners.push(G);
	}, whenDown:function (G) {
		this.connectionDownListeners.push(G);
	}, whenTrouble:function (G) {
		this.connectionTroubleListeners.push(G);
	}, shutdown:function () {
		try {
			this.shutdown = Function.NOOP;
			this.send = Function.NOOP;
			this.connect = Function.NOOP;
			this.heartbeat.stop();
		}
		catch (G) {
		}
		finally {
			[this.onSendListeners, this.onReceiveListeners, this.connectionDownListeners, this.onServerErrorListeners, this.onReceiveFromSendListeners].eachWithGuard(function (H) {
				H.clear();
			});
			this.listener.abort();
			[this.updatesMonitor, this.blockingConnectionMonitor].eachWithGuard(function (H) {
				H.cancel();
			});
			this.listening.remove();
		}
	}});
});
window.logger = new Ice.Log.Logger(["window"]);
window.console && window.console.firebug ? new Ice.Log.FirebugLogHandler(window.logger) : new Ice.Log.WindowLogHandler(window.logger, window);
[Ice.Community].as(function (D) {
	var E = function (Q) {
		try {
			var N = Ice.Cookie.lookup("ice.sessions");
			var R = N.loadValue().split(" ");
			var M = function (S) {
				return S.startsWith(Q);
			};
			var P = R.detect(M);
			if (P) {
				R = R.reject(M);
				var L = P.split("#")[1].asNumber() + 1;
				R.push(Q + "#" + L);
			} else {
				R.push(Q + "#" + 1);
			}
			N.saveValue(R.join(" "));
		}
		catch (O) {
			new Ice.Cookie("ice.sessions", Q + "#" + 1);
		}
	};
	var F = function (M) {
		if (Ice.Cookie.exists("ice.sessions")) {
			var L = Ice.Cookie.lookup("ice.sessions");
			var N = L.loadValue().split(" ");
			L.saveValue(N.inject([], function (O, Q) {
				if (Q) {
					var R = Q.split("#");
					var S = R[0];
					var P = R[1].asNumber();
					if (S == M) {
						--P;
					}
					if (P > 0) {
						O.push(R[0] + "#" + P);
					}
				}
				return O;
			}).join(" "));
		}
	};
	var K = window.views = window.views ? window.views : [];
	var J = function (M, L) {
		E(M);
		K.push(new Ice.Parameter.Association(M, L));
	};
	var C = function () {
		K.each(function (L) {
			F(L.name);
		});
		K.clear();
	};
	var I = new Ice.Ajax.Client(logger.child("dispose"));
	var B = function (L) {
		if (L.isEmpty()) {
			return;
		}
		try {
			var M = L.inject(new Ice.Parameter.Query(), function (O, P) {
				return O.addParameter(P);
			});
			I.postSynchronously(window.disposeViewsURI, M.asURIEncodedString(), function (O) {
				Ice.Connection.FormPost(O);
				O.on(Ice.Connection.OK, Ice.Connection.Close);
			});
		}
		catch (N) {
			logger.warn("Failed to notify view disposal", N);
		}
	};
	var G = function (M, L) {
		F(M);
		K = K.reject(function (N) {
			return N.name == M && N.value == L;
		});
	};
	var H = function (M, L) {
		G(M, L);
		B([new Ice.Parameter.Association(M, L)]);
	};
	var A = function () {
		B(K);
		C();
	};
	window.onBeforeUnload(A);
	D.Application = Object.subclass({initialize:function (P, M) {
		var U = P.session;
		var Q = P.view;
		J(U, Q);
		var X = window.logger.child(U.substring(0, 4) + "#" + Q);
		var T = new Ice.Status.DefaultStatusManager(P, M);
		var L = new Ice.Script.Loader(X);
		var Z = new Ice.Command.Dispatcher();
		var S = new Ice.Document.Synchronizer(window.logger, U, Q);
		var W = Ice.Parameter.Query.create(function (a) {
			a.add("ice.session", U);
			a.add("ice.view", Q);
		});
		var O = function (a) {
			Ice.Document.replaceContainerHTML(M, a);
			L.searchAndEvaluateScripts(M);
		};
		var N = P.synchronous ? new Ice.Connection.SyncConnection(X, P.connection, W) : new D.Connection.AsyncConnection(X, U, Q, P.connection, W, Z);
		var V = function () {
			V = Function.NOOP;
			N.shutdown();
			S.shutdown();
		};
		var R = [];
		var Y = function (a) {
			R.push(a);
		};
		Z.register("noop", Function.NOOP);
		Z.register("set-cookie", Ice.Command.SetCookie);
		Z.register("parsererror", Ice.Command.ParsingError);
		Z.register("redirect", function (b) {
			V();
			var a = b.getAttribute("url").replace(/&#38;/g, "&");
			X.info("Redirecting to " + a);
			window.location.href = a;
		});
		Z.register("reload", function (d) {
			X.info("Reloading");
			var c = window.location.href;
			B = Function.NOOP;
			V();
			if (c.contains("rvn=")) {
				window.location.reload();
			} else {
				var a = d.getAttribute("view");
				if (a == "") {
					window.location.reload();
				} else {
					var b = c.contains("?") ? "&" : "?";
					window.location.href = c + b + "rvn=" + a;
				}
			}
		});
		Z.register("macro", function (a) {
			$enumerate(a.childNodes).each(function (b) {
				Z.deserializeAndExecute(b);
			});
		});
		Z.register("updates", function (a) {
			$enumerate(a.getElementsByTagName("update")).each(function (d) {
				try {
					var b = d.getAttribute("address");
					var g = new Ice.ElementModel.Update(d);
					b.asExtendedElement().updateDOM(g);
					X.debug("applied update : " + g.asString());
					var c = b.asElement();
					Ice.Focus.captureFocusIn(c);
					L.searchAndEvaluateScripts(c);
					if (Ice.StateMon) {
						Ice.StateMon.checkAll();
						Ice.StateMon.rebuild();
					}
				}
				catch (f) {
					X.error("failed to insert element: " + g.asString(), f);
				}
			});
			// han update 20100422
			//try {
			//	var dt = document.getElementById("contentTable");
			//	if (dt != null) {
			//		var width = document.body.clientWidth;
			//		dt.style.width = (width - 250) + "px";
			//	}
			//}
			//catch (e) {}
		});
		Z.register("session-expired", function () {
			try {
				X.warn("Session has expired");
				T.busy.off();
				T.sessionExpired.on();
				G(U, Q);
			}
			finally {
				V();
				R.broadcast();
			}
		});
		window.onUnload(function () {
			V();
		});
		N.onSend(function () {
			T.busy.on();
		}, function () {
			T.busy.off();
		});
		N.onReceive(function (a) {
			var b = a.getResponseHeader("Content-Type");
			if (b.startsWith("text/html")) {
				O(a.content());
			} else {
				if (b.startsWith("text/xml")) {
					S.synchronize();
					Z.deserializeAndExecute(a.contentAsDOM().documentElement);
				} else {
					X.warn("unknown content in response");
				}
			}
			T.connectionTrouble.off();
		});
		N.onServerError(function (a) {
			X.warn("server side error");
			T.busy.off();
			H(U, Q);
			if (a.isEmpty()) {
				T.serverError.on();
			} else {
				O(a.content());
			}
			V();
		});
		N.whenDown(function () {
			X.warn("connection to server was lost");
			T.busy.off();
			T.connectionLost.on();
			V();
		});
		N.whenTrouble(function () {
			X.warn("connection in trouble");
			T.connectionTrouble.on();
		});
		this.attachStatusManager = function (a) {
			T.off();
			T = a(new Ice.Status.DefaultStatusManager(P, M));
			X.info("status indicators were updated");
		};
		this.connection = N;
		this.onSessionExpired = Y;
		this.dispose = V;
		this.disposeAndNotify = function () {
			H(U, Q);
			V();
		};
		X.info("bridge loaded!");
	}});
});
window.onKeyPress(function (A) {
	if (A.isEscKey()) {
		A.cancelDefaultAction();
	}
});
[Ice].as(function (A) {
	function B(H) {
		try {
			return H.asExtendedElement().findBridge();
		}
		catch (F) {
			var E = H.asElement().getElementsByTagName("*");
			var D = E.length;
			for (var C = 0; C < D; C++) {
				var G = E[C];
				if (G.bridge) {
					return G.bridge;
				}
			}
			throw "Cannot find bridge instance among the children or parents of [" + H + "]";
		}
	}
	window.disposeOnViewRemoval = function (C) {
		B(C).disposeAndNotify();
	};
	A.onSendReceive = function (E, D, C) {
		B(E).connection.onSend(D, C);
	};
	A.onAsynchronousReceive = function (D, C) {
		B(D).connection.onReceive(C);
	};
	A.onServerError = function (D, C) {
		B(D).connection.onServerError(function (E) {
			C(E.content());
		});
	};
	A.onSessionExpired = function (D, C) {
		B(D).onSessionExpired(C);
	};
	A.onConnectionTrouble = function (D, C) {
		B(D).connection.whenTrouble(C);
	};
	A.onConnectionLost = function (D, C) {
		B(D).connection.whenDown(C);
	};
});
if (typeof OpenAjax != "undefined" && typeof OpenAjax.registerLibrary != "undefined" && typeof OpenAjax.registerGlobals != "undefined") {
	OpenAjax.registerLibrary("icefaces-d2d", "http://www.icefaces.org/", "1.5.3");
	OpenAjax.registerGlobals("icefaces-d2d", ["Class", "Enumerable", "iceSubmit", "$A", "resetHiddenFieldsFor", "$H", "setFocus", "property", "$R", "$break", "Hashtable", "ObjectRange", "$w", "Template", "current", "$continue", "PeriodicalExecuter", "Try", "currentFocus", "Abstract", "Ice", "iceSubmitPartial"]);
}

